regex 带可选后缀的无重复负向后看

dwthyt8l  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在编写正则表达式,它可以找到满足以下条件的所有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,它使用bazqux两次。有没有其他方法来解决这个问题,而不重复?

有关交互式示例,请参见:https://regex101.com/r/bIosD0/1

xytpbqjk

xytpbqjk1#

你可以 * 丢弃lookbehind*,或者添加另一个负lookbehind *,或者在不同的条件之间使用一个和alternate。假设您还想单独禁止quxbaz

^(?!(?:foo|bar)(?:\/|$)|(?:.*\/)?(?:baz|qux)\/?$).+

^ start处,(?!negativelookahead)包含两个条件:

  1. (?:foo|bar)(?:\/|$)你已经得到的,例如。* 否 * foo/...foobar相同)
  2. |(?:.*\/)?(?:baz|qux)\/?$ORnobazbaz/前面加上optional.*\/any amount of any characters后跟一个斜杠)以进一步禁止,例如.../baz/.../baz at $end
    See this demo at regex101
    我使用(?:非捕获组)进行替换,因为不需要捕获任何内容。

相关问题