2014-11-03 33 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