我正试图设置一个相当复杂的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