regex 如果下面的命名组匹配,则匹配正则表达式

nvbavucw  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(89)

^(?<foo>[a-z]+)?(?<bar>[1-9]+)?$
如果bar(可选)存在/匹配,我需要匹配一个空格。如果bar不匹配,则不需要空格。
abc 100匹配
abc匹配
abc_不匹配(下划线=空格)
abc100不匹配
编辑:对不起,我完全错过了一个额外的要求。
100也匹配。foo是可选的,所以如果foo不存在,但bar存在,那么应该没有前导空格。
你能建议我该怎么做吗?

hvvq6cgz

hvvq6cgz1#

如果你使用的是PCRE 2兼容的正则表达式,你可以使用这个正则表达式:

^(?<foo>[a-z]+)?(?(foo)(?(?=\s*(?&bar))\s|)|)(?<bar>\d+)?$

它匹配:

  • ^:字符串的开头
  • (?<foo>[a-z]+)?:可选捕获组(foo),匹配一个或多个字母
  • (?(foo)(?(?=\s*(?&bar))\s|)|):捕获组foo的条件;如果foo匹配,则测试先行条件\s*(?&bar)(在bar组中捕获的内容之后跟随一定数量的空格)。如果匹配,则下一个字符必须是空格。如果两个条件都不匹配,则它将匹配一个空字符串。这强制要求,如果foobar都被捕获,则它们之间必须有一个空格
  • (?<bar>\d+)?:可选捕获组(bar),匹配一个或多个数字
  • $:字符串结束

regex101上的正则表达式演示

g2ieeal7

g2ieeal72#

您可以使用嵌套组:

^(?<foo>[a-z]+)(?:\s(?<bar>[0-9]+))?$

请参阅regex demo here以了解详细的细分。

fwzugrvs

fwzugrvs3#

看起来您想匹配A或B中的一个,或者两者之间用空格分隔。这里有一个简单的方法,使空间只出现在它应该在的地方:

^(?<foo>[a-z]+)?
(?:^|$|(?<!^) (?!$))
(?<bar>[0-9]+)?$

试试on regex101.com
如果(?<foo>)匹配,则^分支无法匹配;同样,如果$分支匹配,则(?<bar>)不能匹配。一个更聪明(或更愚蠢)的说法是(?>^|$| (?!$)),它利用了原子组防止回溯的事实。
这个正则表达式可以与任何支持lookarounds的引擎一起工作,包括PCRE和. NET。它也独立于(?<foo>)(?<bar>)的内容。

相关问题