【问题标题】:Negative look ahead matching when it should not match不应该匹配时的负前瞻匹配
【发布时间】:2021-04-26 16:20:08
【问题描述】:

我制作了这个正则表达式来匹配正在读取的 var

\bvar\b([^;^{]*?([\s]*?([<]|[>]|[!]|[=]{2})))([^;]*?)(?!=)

这些是我的测试字符串:

var->var1 = blah;     //must not match -but matches
var = 8;              //as expected - do not match          
if(var >= 9)          //as expected - matches
if(var ->var1 == balh) //as expected - matches

here

([&lt;]|[&gt;]|[!]|[=]{2}) 检查是否存在 >、

我的问题是当 var 被读取而不是被写入时它应该匹配(不需要得到结果)。但当 var-&gt; 出现在我的测试字符串中,因为 [&gt;] 它自动匹配 在我的正则表达式中。我尝试了否定前瞻([^;]*?)(?!=) 。但这对我原来的正则表达式没有任何作用。

【问题讨论】:

    标签: python python-3.x regex regex-lookarounds


    【解决方案1】:

    您可以使用修复当前表达式

    \bvar\b(?!->)(?=[^;^{]*(?:[<>!]|==))
    

    请参阅regex demo

    详情

    • \bvar\b - 一个完整的词var
    • (?!-&gt;) - -&gt; 不允许紧跟在当前位置的右侧
    • (?=[^;^{]*(?:[&lt;&gt;!]|==)) - 在当前位置的右侧,必须有除 ;^{ 之外的任何零个或多个字符,然后是 &lt;&gt;!==

    【讨论】:

    • 添加两个 = 的小变化,这适用于大多数情况 \bvar\b(?!->)(?=[^;^{]*([!]|[ =]{2}))。但是当多个 -> 存在时,这不会像这样 - regex101.com/r/2pKyWb/3
    • @Aparnavenugopal 对不起,我误读了 cmets 关于应该匹配的内容。将积极的前瞻固定为(?=[^;^{]*(?:[&lt;&gt;!]|==))
    • @WiktorStribiżew ,当您添加非捕获组时,由于某种原因,它仅在 var 后有一个空格且后跟 -> 时才匹配。今天了解了非捕获组,谢谢。
    • @Aparnavenugopal 尝试完全改进的模式,\bvar\b(?!.*(?&lt;![&gt;&lt;=])=(?!=))(?=(?:\s*-&gt;\s*\w+)*\s*(?:[&lt;!]|-?&gt;|={2})),参见regex101.com/r/2pKyWb/6
    • 谢谢,经过一些修改,我能够获得我needed 的内容。关于您的最后一条评论, \s 的惰性量词将代替文字空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多