为什么使用正则表达式:
changes\s*=\s*[^A].*
匹配
changes = AssignDictionary(out
我想要找的是没有以空格([^A]
)后面的字符“A”(\s*
)开头的单词,并且它假设不匹配该行...我在做什么错?
答案 0 :(得分:5)
由于回溯,[^A]
不起作用。 \s*
匹配零个或多个空格,然后引擎回溯以适应non-A
。由于=
后有两个空格,因此第二个空格与[^A]
- >匹配有一场比赛。
参见步骤12& 13(regex demo):
如果您想在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或空格的任何内容(并延伸匹配到行尾/输入结束。