我昨天刚问了Matching if all of BCD..n exist after last occurrence of A这个问题,得到了一个快速准确的答案(见regex demo)。我认为我可以自己完成下一部分但是很难将模式插入前瞻性构造来模拟Java正则表达式引擎不支持的If-Then-Else条件。这是更新的问题陈述:
匹配的源字符串将如下所示:
mID00231mID00008mID00054mID00013mID00065
mID00231mID00008mID00231mID00054mID00013mID00008mID00065
mID00054mID00065mID00008
因缺少" mID00065"
而无法匹配的示例mID00231mID00054mID00013mID00008
不匹配的示例,因为最后一次出现" mID00231"没有跟随" mID00054"和" mID00008":
mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065
我已经尝试将regex demo中提供的解决方案放入"(那么(?= IF))|(ELSE(?!IF))"前瞻性的构造,但到目前为止已经非常不成功。任何帮助表示赞赏。
答案 0 :(得分:2)
(?:mID00231(?!.*mID00231)(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065))|(?:^(?!.*mID00231)((?=.*mID00054)|(?=.*mID00013)|(?=.*mID00008)|(?=.*mID00065)))
打破它:
|
分隔的两个备选方案
(?:...)
中的第一个备选方案(?:
创建一个未记住的组)
mID00231
找到文字字符串后面跟着...... (?!.*mID00231)
没有出现mID00231
,(?=.*mID00054)
出现任何mID00054
,(?=.*mID00013)
出现任何mID00013
,(?=.*mID00008)
出现任何mID00008
, AND (?=.*mID00065)
出现任何mID00065
(?:...)
中的第二个替代方案
^
将匹配锚定到字符串的开头(?!.*mID00231)
没有出现mID00231
,后面跟着...... (?:...)
中的四个备选方案
(?=.*mID00054)
出现任何mID00054
,(?=.*mID00013)
出现任何mID00013
,(?=.*mID00008)
出现任何mID00008
,或 (?=.*mID00065)
出现任何mID00065