2014-11-03 121 views
0

我想建立一个相当复杂的正则表达式,但我不能避免只有一个元素从不匹配的列表。PHP的正则表达式:不能排除一个元素

我的正则表达式为:

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.and
  • 1234567-8_abc_gmg.and
  • 1234567-8_abc_ddd.and
  • 1234567-8_abc_qwert.ios
  • 1234567-8_abc_88.ios

好了,我不能排除第一个选项(1234567-8_abc.ios)。我想试试here

我该如何做到这一点?

谢谢!

回答

0

此正则表达式的例子匹配PHP:

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

添加负前瞻像下面,

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

DEMO

(?!_ABC|_DEFGHI)负先行断言以下字符串_abc不会_ABC_DEFGHI。并且在.ios.and之前必须有一个或多个单词字符。所以它不会匹配这个1234567-8_abc.ios字符串。

1

您可以使用此模式:

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

注:我认为_.ios之间的每个子不包含点或下划线。

possessive quantifier++需要有不太可能回溯失败更快步骤

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

尝试this.Your正则表达式已经离开\w1234567-8_abc optional.Just使它compulsary.See演示。

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

+0

只是一个小提示:'[\ w]'可以只是'\ w'。 – 2014-11-03 15:56:19

+0

@AmalMurali啊对:(编辑 – vks 2014-11-03 15:58:29