2016-03-07 67 views
1

我有以下的正則表達式:正則表達式負向前查找工作不正常

[a-zA-Z0-9. ]*(?!cs) 

和字符串

Hotfix H5.12.1.00.cs02_ADV_LCR 

我想只匹配,直到

Hotfix H5.12.1.00 

但正則表達式匹配直到「cs02」

不應該有否定性的前瞻已經完成了這項工作?

+1

https://regex101.com/r/hQ2gD5/2 – Maroun

+1

如果您需要使用負向前視,您可以考慮使用脾氣暴躁的令牌:['(?:(?!cs)[a-zA-Z0 -9。])*'](https://regex101.com/r/dS7cZ2/1)。真正的解決方案取決於你是否需要'.cs'存在於字符串中。 –

回答

0

您可以考慮使用一個tempered greedy token

(?:(?!\.cs)[a-zA-Z0-9. ])* 

regex demo

因爲回火貪婪令牌任何0+字符從[a-zA-Z0-9. ]字符類是不匹配.cs這無論.cs是否存在字符串中或無法正常工作。

0

您需要使用積極lookahead而不是負向lookahead。

[a-zA-Z0-9. ]*(?=\.cs) 

[a-zA-Z0-9. ]+(?=\.cs) 

請注意,你的正則表達式[a-zA-Z0-9. ]*(?!cs)是貪婪,直到它到達其後面沒有cs邊界的所有字符匹配。見here

起初模式[a-zA-Z0-9. ]+匹配Hotfix H5.12.1.00.cs02貪婪,因爲這種模式貪婪地匹配字母,點和空格。一旦它看到下劃線字符,它停止匹配,其中這兩個條件滿足,

  1. _將不會被[a-zA-Z0-9. ]+
  2. _匹配不cs

它的工作原理相同,爲進一步兩場比賽也是。

+0

謝謝,這工作,但因爲我需要cs字符串存在與否,WiktorStribiżew提供的消極lookahead的答案完成工作 – patentul

+0

此https://regex101.com/r/dS7cZ2/3?請注意,在php'g'默認情況下是啓用的。不知道爲什麼你願意使用負面的預測而不是簡單的積極預測。 –