为什么[^ A]不起作用?

时间:2016-03-02 14:01:06

标签: regex

为什么使用正则表达式:

changes\s*=\s*[^A].*

匹配

changes =  AssignDictionary(out

我想要找的是没有以空格([^A])后面的字符“A”(\s*)开头的单词,并且它假设不匹配该行...我在做什么错?

2 个答案:

答案 0 :(得分:5)

由于回溯,[^A]不起作用。 \s*匹配零个或多个空格,然后引擎回溯以适应non-A。由于=后有两个空格,因此第二个空格与[^A] - >匹配有一场比赛。

参见步骤12& 13(regex demo):

enter image description here

如果您想在A之后=时失败,则需要否定前瞻

changes\s*=(?!\s*A)\s*.*
           ^^^^^^^^ 

请参阅another demo

或另一个PCRE变体:changes\s*=\s*+(?!A).*(在A之后的所有空格后检查字符是否为=

如果你的正则表达式引擎支持原子组或占有量词,你可以通过阻止回溯到\s*构造来使你的正则表达式工作

changes\s*=\s*+[^A].*
             ^^ (possessive quantifier)

changes\s*=(?>\s*)[^A]\s*.*
           ^^    ^ - atomic group 

如果您的引擎不支持原子组,也不支持占有量词,您可以使用捕获组/反向引用组合禁用回溯(以模拟原子组):

changes\s*=(?=(\s*))\1[^A].*

请参阅this demo

尽管如此,第一种具有先行优势的解决方案更为可取,因为它似乎是最普遍的解决方案。最快的看起来是具有占有量词的那个。

答案 1 :(得分:0)

也可以用普通的正则表达式来实现。只需在“not A”之前指出任意数量的空格之后的有效字符。如你所说,这是:不是A,但当然也“不是空间”。 否则回溯将允许位于A位置之前的空间 匹配“不是A”并打败你的意图。

使用更改\ s * = \ s * [^ A \ s]。* 将匹配等号后面的空格后没有A或空格的任何内容(并延伸匹配到行尾/输入结束。