除非第 1 组模式再次出现在同一行上,否则正则表达式如何匹配第 1 组之后的所有内容?

How can a Regex match everything after group 1 unless group 1 pattern appears again on the same line?

我在理解如何捕获可选前缀后的所有内容时遇到问题,除非再次显示该前缀。最好让 [FFFFFF] 标签作为第 1 组重新开始匹配,而不是作为可选的附加组。

我 new-ish 正则表达式,我喜欢 regex101.com 网站,但这似乎超出了我的理解水平。

表达式:

(\[[0-9a-fA-F]{6}\])?(.*)

示例文本

[00B800][!] Green - [004DB8] Blue does not match!!

[FFFFff][!] White

[e60000][!] Red

123456

Test string, another test abcdef

这是我试图得到的结果。

Link

https://regex101.com/r/z3CbHm/2/

您可以使用 2 个捕获组,使第一个组可选。

然后对于第二组,匹配直到看到模式 \[[0-9a-fA-F]{6}\] 的下一次出现或字符串的结尾。

(\[[0-9a-fA-F]{6}\])?(.+?)(?=\[[0-9a-fA-F]{6}\]|$)

Regex demo

如果您想省略第二组可能的前导空白字符:

(\[[0-9a-fA-F]{6}\])?(?:[^\S\r\n]*(.+?))(?=\[[0-9a-fA-F]{6}\]|$)

那将匹配

  • (\[[0-9a-fA-F]{6}\])? 匹配可选 组 1
  • 中的模式
  • (?:非捕获组
    • [^\S\r\n]* 匹配出现 0 次以上的空白字符,换行符除外
    • (.+?)捕获 组 2,匹配出现 1 次以上的任何字符,换行符除外
  • ) 关闭群组
  • (?=正lookhead,断言右边的是
    • \[[0-9a-fA-F]{6}\] 匹配模式
    • |
    • $ 字符串结束
  • ) 关闭前瞻

Regex demo