PCRE 正则表达式 - 排除某些情况

PCRE Regex - exclude some cases

$regex = /(^)(\[(.*)\]) (.*)$/;

正则表达式采用如下所示的所有消息:

[Help] John: ...

问题是聊天中有如下所示的消息:

[      ] Tehnical information: ...
[ >Important< ] ...
[ >>>  ] ...
[ <<<  ] ...

所以,我需要排除消息,其中:

空格和符号 '>', '<' 可以在其他情况下存在,如果有其他字符,例如数字或其他字符,则应采用此消息。

[General] John: Hi!
[ > BUFF < ] ...
[ >>> 45] ...
/^(?!\[[ <>]*(?:Important)?[ <>]*\])(\[(.*)\]) (.*)$/
  • (?!) - 否定前瞻以确保
  • \[\] - 方括号里面的东西不是
  • [ <>]*(?:Important)?[ <>]* - 只是可变数量 (*) 的空格,<> 以及可选 (?) 出现的单词Important里面。

我建议

^(\[(?![ <>]*(?:Important[ <>]*)?])(.*)]) (.*)$

regex demo

如果里面只有 space,或者如果 Important 之前或之后有任何 space 的话,(?![ <>]*(?:Important[ <>]*)?]) 否定前瞻将使您的正则表达式匹配失败, <> 任意顺序。

请注意,先行放置在开口 [ 之后,如果放置在 [.

之前并包含在内,则可以减少冗余回溯

图案详情:

  • ^ - 字符串开头
  • (\[ - 第 1 组开始,开场 [
  • (?![ <>]*(?:Important[ <>]*)?]) - 如果匹配以下项,则匹配失败的否定前瞻:
    • [ <>]* - 0+ 个字符:space、<>
    • (?:Important[ <>]*)? - 1 或 0 个序列
      • Important - 文字
      • [ <>]* - 0+ 个字符:space、<>
    • ] - 关闭 ]
  • (.*) - 第 2 组,匹配除换行符以外的 0+ 个字符
  • ]) - 第 1 组结束,] 匹配结束 ]
  • (.*) - 第 3 组,匹配换行符以外的 0+ 个字符
  • $ - 字符串结尾