正则表达式匹配任何字符或不匹配字符,给定的例外情况除外

Regex matching any or no character except for given exceptions

我正在尝试匹配前面没有字符的字符串,但可能什么也没有。

示例:我想在括号中匹配 "test" 的所有情况,除非它们前面有“[”或“|”。

示例字符串:

(1) {this is a test}              // match
(2) {this [is] also a test }      // match
(3) {test}                        // match
(4) {this is the third |test}     // no match
(5) {this is the third [test}     // no match

我的第一次尝试是这样的:

\{.*[^\||\[]test.*\}

当然,这不匹配(3),因为括号和"test"之间没有字符。

然后我尝试了一个消极的环顾:

\{.*(?!\||\[)test.*\}

但这匹配所有示例字符串。显然,javascript 或我正在使用的环境不支持后视。

有办法吗?我错过了什么?

谢谢。

您可以使用以下正则表达式:

\{[^\{\}]*(?<![\[|])test[^\{\}]*\}

步骤:

  • \{, 从左大括号开始。
  • [^\{\}]*,后跟零个或多个非大括号。
  • (?| 或 [.
  • 之后的测试
  • [^\{\}]*,后跟零个或多个非大括号。
  • \},后跟一个右大括号。

如果您的语言不接受回溯,那么您可以考虑以下基于正向回溯的正则表达式。

^(?=\{)[^}]*?[^\[|]test[^}]*}

DEMO