我有以下的正则表达式:正则表达式负向前查找工作不正常
[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'存在于字符串中。 –