这个负面的前瞻我做错了什么?过滤掉正则表达式

时间:2016-10-13 09:45:55

标签: python regex sublimetext3

我有一个由软件生成的大量代码。每条指令都有一个标识号,我只需要修改某些数字:

grr.add(new GenericRuleResult(RULEX_RULES.get(String.valueOf(11)), new Result(0,Boolean.FALSE,"ROSSO")));
grr.add(new GenericRuleResult(RULEX_RULES.get(String.valueOf(12)), new Result(0,Boolean.FALSE,"£££")));
etc...

现在,我使用SublimeText3使用此正则表达式快速更改所有错误的行:

Of\((11|14|19|20|21|27|28|31)\)\), new Result\(

上面的这个正则表达式允许我把#ROSSO" (红色)包含这些数字的每一行。现在我必须把" VERDE" (绿色)在剩余的行中。我的想法是在正则表达式中添加?!来查找 NOT CONTAINING 这些数字的所有行。

从网站Regex101我得到了正则表达式的描述:

Of matches the characters Of literally (case sensitive)
\( matches the character ( literally (case sensitive)
    Negative Lookahead (?!11|14|19|20|21|27|28|31)
    Assert that the Regex below does not match
       1st Alternative 11
       etc...

那么为什么我找不到包含12,13,14等的行?

编辑:实际正则表达式:Of\((?!11|14|19|20|21|27|28|31)\)\), new Result\(

1 个答案:

答案 0 :(得分:2)

你的问题是你正在假设一个负向的前方改变光标位置,它没有。

也就是说,(?!xy)形式的否定前瞻仅仅验证 next 两个字符不是xy。然后它不会从文本中吞下两个字符。顾名思义,它只是向前看,而不是前进!

因此,如果您希望在该断言之外进一步匹配,您必须:

  • 否定声明它不是xy;
  • 然后消耗两个字符,无论它们是什么;
  • 然后继续你的比赛。

所以尝试类似:

Of\((?!11|14|19|20|21|27|28|31)..\)\), new Result\(