反向查找反向正则表达式

reverse lookup inverted regex

我正在处理类似这样的字符串:

ABCD_EFGHI-78-32#1-R77.2_301009_1_AB3_CD

分隔符是:_

我需要一个正则表达式,如果第二部分 [EFGHI-98-32#1-R77.2] 在该块中的任何地方包含不区分大小写的“TesT”,但它会匹配任何其他情况。

所以我是这样开始的:

^[A-Z]{4,5}_(?i)(?<=_)(.*)(?=TEST)(?-i).+?(?=_)_\d{6}_\d_.{2}\d_.{2}

但我不知道如何将 ?=TEST 反转为 ?!=TEST,我注意到分组和匹配也存在差异。

如果第二个块包含定界符之间的单词测试的任何变体,我将不胜感激在正则表达式的制定方面提供一些帮助,以便整个字符串匹配。

例如。这个有效,但前提是第二个块以单词测试开头:

^[A-Z]{4,5}_((?i)(?!test)(?-i).+?(?=_))_\d{6}_\d_.{2}\d_.{2}$

谢谢!

你必须在每个没有出现 test 的字符处进行测试。所以你的第二组基本上应该是

(?:(?!test)[^_])+

将其合并到您的正则表达式中,并添加不区分大小写的标志,

^[A-Z]{4,5}_(?:(?!(?i)test)[^_])+_\d{6}_\d_[^_]{2}\d_[^_]{2}

(你可能不想要 .{2},因为它会接受 __,例如——所以明确限制字符集是有道理的)

这里是您的模式的快速修复:

^[A-Z]{4,5}_((?![^_]*(?i:test))[^_]*)_\d{6}_\d_.{2}\d_.{2}$

参见regex demo。我只替换了第 2 组模式:

  • (?![^_]*(?i:test)) - 如果 _ 后跟不区分大小写的 test 字符串(注意内联修饰符组是用于使该模式更短一些,并且也更便携)
  • [^_]* - 除下划线外的任何零个或多个字符。