正则表达式否定前瞻没有按预期工作

时间:2016-03-07 12:59:59

标签: regex

我有以下正则表达式:

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

和字符串

Hotfix H5.12.1.00.cs02_ADV_LCR

我想只匹配直到

Hotfix H5.12.1.00

但正则表达式匹配直到" cs02"

负面的前瞻不应该完成这项工作吗?

2 个答案:

答案 0 :(得分:0)

你需要使用积极的前瞻而不是消极的前瞻。

[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. 匹配
  3. _不是cs
  4. 它也适用于另外两场比赛。

答案 1 :(得分:0)

您可以考虑使用tempered greedy token

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

请参阅regex demo

无论字符串中是否存在.cs,这都会有效,因为调和的贪婪令牌与[a-zA-Z0-9. ]不是.cs的{​​0}}字符类中的任何0+字符匹配。 / p>