我有以下的正則表達式:正則表達式負向前查找工作不正常
[a-zA-Z0-9. ]*(?!cs)
和字符串
Hotfix H5.12.1.00.cs02_ADV_LCR
我想只匹配,直到
Hotfix H5.12.1.00
但正則表達式匹配直到「cs02」
不應該有否定性的前瞻已經完成了這項工作?
我有以下的正則表達式:正則表達式負向前查找工作不正常
[a-zA-Z0-9. ]*(?!cs)
和字符串
Hotfix H5.12.1.00.cs02_ADV_LCR
我想只匹配,直到
Hotfix H5.12.1.00
但正則表達式匹配直到「cs02」
不應該有否定性的前瞻已經完成了這項工作?
您可以考慮使用一個tempered greedy token:
(?:(?!\.cs)[a-zA-Z0-9. ])*
因爲回火貪婪令牌任何0+字符從[a-zA-Z0-9. ]
字符類是不匹配.cs
這無論.cs
是否存在字符串中或無法正常工作。
您需要使用積極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
貪婪,因爲這種模式貪婪地匹配字母,點和空格。一旦它看到下劃線字符,它停止匹配,其中這兩個條件滿足,
_
將不會被[a-zA-Z0-9. ]+
_
匹配不cs
它的工作原理相同,爲進一步兩場比賽也是。
謝謝,這工作,但因爲我需要cs字符串存在與否,WiktorStribiżew提供的消極lookahead的答案完成工作 – patentul
此https://regex101.com/r/dS7cZ2/3?請注意,在php'g'默認情況下是啓用的。不知道爲什麼你願意使用負面的預測而不是簡單的積極預測。 –
https://regex101.com/r/hQ2gD5/2 – Maroun
如果您需要使用負向前視,您可以考慮使用脾氣暴躁的令牌:['(?:(?!cs)[a-zA-Z0 -9。])*'](https://regex101.com/r/dS7cZ2/1)。真正的解決方案取決於你是否需要'.cs'存在於字符串中。 –