我正在编写正则表达式,它可以找到满足以下条件的所有stings:
- 不以
foo/
或bar/
或foo
(行尾)或bar
(行尾)开头 - 不以
/baz
或/qux
结尾且不以/baz/
或/qux/
结尾
不应匹配的示例:
foo
bar/nomatch
/nomatch/baz
nomatch/baz/
示例应匹配:
foomatch
bazmatch
/baz/match
我提出的正则表达式结合了负的lookahead和负的lookbehind:
/(?!(foo|bar)(\/|$)).*(?<!(\/)(baz|qux)(\/|$))/gm
我的问题:负后看需要具有固定的宽度(即:我不能使用(\/|$)
来检查字符串末尾的可选斜杠)。我可以通过创建以下规则来解决这个问题:/(?!(foo|bar)(\/|$)).*(?<!(\/)(baz|qux))(?<!(\/)(baz|qux)\/)/gm
,它使用baz
和qux
两次。有没有其他方法来解决这个问题,而不重复?
有关交互式示例,请参见:https://regex101.com/r/bIosD0/1
1条答案
按热度按时间xytpbqjk1#
你可以 * 丢弃lookbehind*,或者添加另一个负lookbehind *,或者在不同的条件之间使用一个和alternate。假设您还想单独禁止
qux
和baz
。在
^
start处,(?!
negativelookahead)
包含两个条件:(?:foo|bar)(?:\/|$)
你已经得到的,例如。* 否 *foo/...
、foo
(bar
相同)|(?:.*\/)?(?:baz|qux)\/?$
ORnobaz
,baz/
前面加上optional.*\/
(any amount of any characters后跟一个斜杠)以进一步禁止,例如.../baz/
,.../baz
at$
end。See this demo at regex101
我使用
(?:
非捕获组)
进行替换,因为不需要捕获任何内容。