2016-03-07 85 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'默认情况下是启用的。不知道为什么你愿意使用负面的预测而不是简单的积极预测。 –