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

时间:2016-09-13 18:04:19

标签: regex

我有一个如下所示的源字符串:mID00231mID00008mID00231mID00054mID00013mID00008mID00065

我尝试使用这个例子创建的模式是:对于最后一次出现的" mID00231"在字符串中, {mID00054,mID00013,mID00008,mID00065}的一个或多个出现必须遵循它(任何顺序)。

比赛示例:

mID00231mID00008mID00231mID00054mID00013mID00008mID00065
mID00231mID00013mID00054mID00008mID00065mID00008

因缺少" mID00065"

而无法匹配的示例
mID00231mID00054mID00013mID00008

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

mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065

我对正则表达式相当新,但通常会找到有效的东西。这一个非常困难。我试过这个:

(?:mID00231)(?:(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*)

如果第一个元素(mID00231)只出现一次,则它有效。如果元素重复,则模式失败。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果前端为负值,则需要使匹配失败:

mID00231((?!.*mID00231)(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065).*)
         ^^^^^^^^^^^^^^

请参阅regex demo

<强>详情

  • mID00231 - 匹配文字mID00231文字
  • ( - 捕获组的开始
    • (?!.*mID00231) - 在0 +以上任何字符之后的任何位置都不能有mID00231,但是换行符
    • (?=.*mID00054) - 0 +以上任何字符后必须有mID00054,但换行符
    • (?=.*mID00013) - 0 +以上任何字符后必须有mID00013,但换行符
    • (?=.*mID00008) - 0 +以上任何字符后必须有mID00008,但换行符
    • (?=.*mID00065) - 0 +以上任何字符后必须有mID00065,但换行符
  • .* - 0+任何字符,但换行符
  • ) - 捕获组的结束。