php regexp:can';t排除一个元素


php regexp: can't exclude one element

我正试图设置一个相当复杂的regexp,但我无法避免不匹配列表中只有一个元素。

我的正则表达式是:

1234567-8_abc((?!_ABC|_DEFGHI)['w]?)*('.ios|'.and)

我必须排除的是:

  • 1234567-8_abc.ios
  • 1234567-8_abc_DEFGHI.ios
  • 1234567-8_abc_abc.ios

相反,我必须包括的是:

  • 1234567-8_abc_1UP.ios
  • 1234567-8_abc_FI.ios
  • 1234567-8_abc_gmg.ios
  • 1234567-8_abc_1UP.and
  • 1234567-8_abc_FI.和
  • 1234567-8_abc_gmg.and
  • 1234567-8_abc_ddd.and
  • 1234567-8_abc_qwert.ios
  • 1234567-8_abc_88.ios

好吧,我不能排除第一个选项(123467-8_abc.ios)。

我在这里试过了。

我怎样才能做到这一点?

谢谢!

您可以使用以下模式:

1234567-8_abc_[^_.]++(?<!_ABC|_DEFGHI)'.(?:ios|and)

注意:我假设_.ios之间的每个子字符串都不包含句点或下划线。

所有格量词++必须以较少可能的回溯步骤更快地失败

此正则表达式与PHP中的示例匹配:

1234567-8_abc_((?!ABC|DEFGHI)['w]?)*('.ios|'.and)

添加一个负面展望,如下所示,

1234567-8_abc(?!_ABC|_DEFGHI)'w+('.ios|'.and)

演示

(?!_ABC|_DEFGHI)否定前瞻断言_abc后面的字符串不是_ABC_DEFGHI。并且它必须在.ios.and之前有一个或多个单词字符。所以它与这个1234567-8_abc.ios字符串不匹配。

1234567-8_abc(?:(?!_ABC|_DEFGHI)'w)+('.ios|'.and)

试试这个。正则表达式在1234567-8_abc之后保留了'w(可选)。只是强迫性的。请参阅演示。

http://regex101.com/r/bB8jY7/1