测试包含特定模式的字符串,除非另一个模式在它之前

Test strings that contain a specific pattern unless another pattern is before it

我想测试包含模式 \[[A-Z]+\].

的字符串

但是如果前面有--,字符串应该不会通过。

通过

Even there's a -- before [DELETE], but there's no -- before [GET] so it still counts

失败

我尝试了 ^(?!.*--.*\[[A-Z]+\]).*\[[A-Z]+\] 但失败了 test [GET] test --test [DELETE] test

这是 Regex101

上的一个项目

有正则表达式可以测试吗?

您可以使用这个正则表达式:

^(?:(?!--).)*\[[A-Z]+\]

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?:: 启动非捕获组
    • (?!--):否定前瞻断言我们没有 --
    • .:匹配任意字符
  • )*:结束非捕获组。匹配该组中的 0 个或多个
  • \[[A-Z]+\]:匹配 [ 后跟大写后跟 ]

或者您也可以将此正则表达式与 PCRE 动词一起使用 (*SKIP)(*FAIL):

--.*(*SKIP)(*F)|\[[A-Z]+\]

RegEx Demo 2

另一种选择是

^[^-[]*(?:(?:\[(?![A-Z]+])|-(?!-))[^-[]*)*\[[A-Z]+]

模式匹配:

  • ^ 字符串开头
  • [^-[]* 可选择匹配除 [-
  • 之外的任何字符
  • (?:非捕获组
    • (?:非捕获组
      • \[(?![A-Z]+]) 匹配 [ 后没有直接跟随 A-Z]
      • |
      • -(?!-) 匹配 - 当没有直接跟随 -
    • )关闭非捕获组
    • [^-[]* 可选择匹配除 [-
    • 之外的任何字符
  • )* 关闭非捕获组并选择性地重复它
  • \[[A-Z]+] 在方括号之间匹配 1+ 个字符 A-Z

Regex demo