Regex 什么是一个好的正则表达式来匹配一个单词中的可选空格?

Regex 什么是一个好的正则表达式来匹配一个单词中的可选空格?,regex,Regex,数字是可选的,并且只允许出现在单词的末尾 空间是可选的,只允许在单词的中间。 我只是想用一些语言来匹配可能的月份,比如说英语和越南语 例如,以下是有效匹配项: 'June' “tháng 6” 但以下不是因为空格:'June''June' 这是我的测试用例: 正如您所看到的,我提出了^\S[\S]+\S$,这是一种可行的方法,但我想知道是否有更好的方法来实现这一点。要匹配JavaScript正则表达式中没有前导和尾随空格的字符串,可以使用以下几个选项: 要求第一个和最后一个非空白字符带有\S(

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

空间是可选的,只允许在单词的中间。

我只是想用一些语言来匹配可能的月份,比如说英语和越南语

例如,以下是有效匹配项:

'June'
“tháng 6”

但以下不是因为空格:
'June'
'June'

这是我的测试用例:


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

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

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

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

  • 您可以使用lookaheads来要求第一个和最后一个字符为非空白字符:
    ^(?=[\S\S]*\S$)\S[\S]*$
    ,其中
    (?=[\S\S]*\S$)
    要求最后一个字符为非空白字符,而先行操作后的
    \S
    将要求第一个字符为非空白字符<代码>[\s\s]*匹配0+任何字符这将匹配1个字符字符串,但不会匹配空字符串

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

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


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

单词中间、真正的中间(一个索引)或只是前后应该有文本是什么意思?包括相关的“代码”和问题本身中的示例数据。如果需要匹配1个字符字符串,请使用。我喜欢@WiktorStribiżew给出的解决方案。您也可以使用
^(\S+[\S]*\S++$
,这也可以解释1个字符长的字符串。@VladislavMartin:我想您是想写
^(\S+[\S]*\S}\S)+$
。否则,回溯就太过分了!