如果A存在,则在最后一次出现A之后匹配所有BCD..n,否则为BCD..n

时间:2016-09-14 13:46:18

标签: java regex

我昨天刚问了Matching if all of BCD..n exist after last occurrence of A这个问题,得到了一个快速准确的答案(见regex demo)。我认为我可以自己完成下一部分但是很难将模式插入前瞻性构造来模拟Java正则表达式引擎不支持的If-Then-Else条件。这是更新的问题陈述:

  • IF " mID00231"存在于源字符串中
    • 那么,最后一次出现" mID00231"在字符串中, {mID00054,mID00013,mID00008,mID00065}的一个或多个出现必须遵循它(任意顺序),
  • ELSE
    • 必须出现 任何 {mID00054,mID00013,mID00008,mID00065}的一个或多个

匹配的源字符串将如下所示:

mID00231mID00008mID00054mID00013mID00065
mID00231mID00008mID00231mID00054mID00013mID00008mID00065
mID00054mID00065mID00008

因缺少" mID00065"

而无法匹配的示例
mID00231mID00054mID00013mID00008

不匹配的示例,因为最后一次出现" mID00231"没有跟随" mID00054"和" mID00008":

mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065

我已经尝试将regex demo中提供的解决方案放入"(那么(?= IF))|(ELSE(?!IF))"前瞻性的构造,但到目前为止已经非常不成功。任何帮助表示赞赏。

1 个答案:

答案 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