数字是可选的,并且只能出现在单词的末尾
空格是可选的,并且只能出现在单词中间。
我几乎只是想用几种语言匹配可能的月份,比如英语和越南语
例如,以下是有效匹配:
'六月'
'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/