regex - 什么是匹配带有可选空格的单词的良好正则表达式?

标签 regex

数字是可选的,并且只能出现在单词的末尾

空格是可选的,并且只能出现在单词中间。

我几乎只是想用几种语言匹配可能的月份,比如英语和越南语

例如,以下是有效匹配:

'六月' 'tháng 6'

但以下不是因为空间问题:'June' 'June'

这是我的测试用例:https://regex101.com/r/pZ0mN3/2

正如你所看到的,我想出了 ^\S[\S ]+\S$ 这是一种可行的方法,但我想知道是否有更好的方法来做到这一点。

最佳答案

要匹配 JavaScript 正则表达式风格中没有前导和尾随空格的字符串,您可以使用多个选项:

  • 要求第一个和最后一个非空白字符为 \S (=[^\s])。这可以通过 ^\S[\S\s]*\S$ 来完成。 此正则表达式要求字符串中至少包含 2 个字符。由于您使用了 +,因此您的正则表达式需要输入 3 个字符。它也不允许某些 Unicode 空格。

  • 您可以将分组与可选量词(允许 0 长度匹配的量词)结合使用。请参阅^\S(?:\s*\S+)*$ (其中 \s 替换为 ,因为它是多行演示)。开头的 \S 匹配非空白字符,然后是非捕获组,即 * 量化(匹配零次或多次出现)并匹配 0+ 0+ 空格序列后跟 1+ 非空格字符。 对于像 RE2 这样不支持环顾但支持量化组的风格来说,这是一个很好的表达。

  • 您可以使用前瞻来要求第一个和最后一个字符为非空白字符:^(?=[\S\s]*\S$)\S[\S\s] *$ 其中 (?=[\s\S]*\S$) 要求最后一个字符为非空格,并且后面的 \S前瞻将要求第一个字符非空白。 [\s\S]* 匹配 0+ 任意字符。 这将匹配 1 个字符的字符串,但不会匹配空字符串

  • 如果匹配没有前导/尾随空格的字符串的正则表达式也应匹配空字符串,请使用 2 个负向前瞻:^(?!\s)(?![\S\s]*\s$)[\S\s]*$ 。如果存在前导空格,则 (?!\s) 前瞻将使匹配失败,(?![\S\s]*\s$) 将执行尾随空格的情况相同,并且 [\s\S]* 将匹配 0+ 任何字符。 *如果不支持环视,请使用效率低得多的^(?:\S(?: *\S+)*)?$

如果您不需要匹配非空白字符之间的任何字符,您可以将 [\s\S] 恢复为 [\S ]。在 PCRE 中,水平空白可以与 \h 匹配,在 .NET 和其他支持 Unicode 属性的语言中,可以使用 [\t\p{Zs}] 来匹配匹配任何水平空白。在 JS 中,可以使用 [^\S\r\n\f\v\u2028\u2029] 来实现此目的。

注意,某些正则表达式风格不支持非捕获组,您可以将上述模式中的所有 (?: 替换为 ( .

关于regex - 什么是匹配带有可选空格的单词的良好正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822383/

相关文章:

python - 引发异常是测试输入类型的可接受方法

regex - vim:显示子匹配内容和替换中的未命名寄存器

python - python 正则表达式中的字素支持

javascript - 从JS中的字符串中提取姓名和电子邮件

javascript - PHP 中的反向引用到 JS 正则表达式翻译

regex - Vbscript 正则表达式 - 匹配 [下一页]

javascript - 为什么正则表达式使用 Angular $sce 在 "t"中查找 "Georgia"?

javascript - 尝试通过 jQuery/replace() 删除括号内的 anchor 文本

php - 从 url 获取 itunes id

regex - 正则表达式匹配用冒号连接的单词对