^(?<foo>[a-z]+)?(?<bar>[1-9]+)?$如果bar(可选)存在/匹配,我需要匹配一个空格。如果bar不匹配,则不需要空格。abc 100匹配abc匹配abc_不匹配(下划线=空格)abc100不匹配编辑:对不起,我完全错过了一个额外的要求。100也匹配。foo是可选的,所以如果foo不存在,但bar存在,那么应该没有前导空格。你能建议我该怎么做吗?
^(?<foo>[a-z]+)?(?<bar>[1-9]+)?$
bar
abc 100
abc
abc_
abc100
100
foo
hvvq6cgz1#
如果你使用的是PCRE 2兼容的正则表达式,你可以使用这个正则表达式:
^(?<foo>[a-z]+)?(?(foo)(?(?=\s*(?&bar))\s|)|)(?<bar>\d+)?$
它匹配:
^
(?<foo>[a-z]+)?
(?(foo)(?(?=\s*(?&bar))\s|)|)
\s*(?&bar)
(?<bar>\d+)?
$
regex101上的正则表达式演示
g2ieeal72#
您可以使用嵌套组:
^(?<foo>[a-z]+)(?:\s(?<bar>[0-9]+))?$
请参阅regex demo here以了解详细的细分。
fwzugrvs3#
看起来您想匹配A或B中的一个,或者两者之间用空格分隔。这里有一个简单的方法,使空间只出现在它应该在的地方:
^(?<foo>[a-z]+)? (?:^|$|(?<!^) (?!$)) (?<bar>[0-9]+)?$
试试on regex101.com。如果(?<foo>)匹配,则^分支无法匹配;同样,如果$分支匹配,则(?<bar>)不能匹配。一个更聪明(或更愚蠢)的说法是(?>^|$| (?!$)),它利用了原子组防止回溯的事实。这个正则表达式可以与任何支持lookarounds的引擎一起工作,包括PCRE和. NET。它也独立于(?<foo>)和(?<bar>)的内容。
(?<foo>)
(?<bar>)
(?>^|$| (?!$))
3条答案
按热度按时间hvvq6cgz1#
如果你使用的是PCRE 2兼容的正则表达式,你可以使用这个正则表达式:
它匹配:
^
:字符串的开头(?<foo>[a-z]+)?
:可选捕获组(foo
),匹配一个或多个字母(?(foo)(?(?=\s*(?&bar))\s|)|)
:捕获组foo
的条件;如果foo
匹配,则测试先行条件\s*(?&bar)
(在bar
组中捕获的内容之后跟随一定数量的空格)。如果匹配,则下一个字符必须是空格。如果两个条件都不匹配,则它将匹配一个空字符串。这强制要求,如果foo
和bar
都被捕获,则它们之间必须有一个空格(?<bar>\d+)?
:可选捕获组(bar
),匹配一个或多个数字$
:字符串结束regex101上的正则表达式演示
g2ieeal72#
您可以使用嵌套组:
请参阅regex demo here以了解详细的细分。
fwzugrvs3#
看起来您想匹配A或B中的一个,或者两者之间用空格分隔。这里有一个简单的方法,使空间只出现在它应该在的地方:
试试on regex101.com。
如果
(?<foo>)
匹配,则^
分支无法匹配;同样,如果$
分支匹配,则(?<bar>)
不能匹配。一个更聪明(或更愚蠢)的说法是(?>^|$| (?!$))
,它利用了原子组防止回溯的事实。这个正则表达式可以与任何支持lookarounds的引擎一起工作,包括PCRE和. NET。它也独立于
(?<foo>)
和(?<bar>)
的内容。