gpt4 book ai didi

regex - 正则表达式负前瞻

转载 作者:行者123 更新时间:2023-12-04 09:37:42 36 4
gpt4 key购买 nike

我正在做一些正则表达式体操。我给自己设置了尝试搜索 C# 代码的任务,其中使用了 as-operator,而不是在合理的空间内进行空检查。现在我不想解析 C# 代码。例如。我想捕获代码片段,例如

    var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1.a == y1.a)

但是,不捕获
    var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1 == null)

也不就此而言
    var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(somethingunrelated == null) {...}
if(x1.a == y1.a)

因此,任何随机空检查都将算作“良好检查”,因此不会被发现。

问题是:我如何匹配某些东西,同时确保在其周围环境中找不到其他东西。

我尝试了天真的方法,寻找 'as' 然后在 150 个字符内做一个负面的前瞻。
\bas\b.{1,150}(?!\b==\s*null\b)

不幸的是,上面的正则表达式匹配了上面所有的例子。我的直觉告诉我,问题是向前看然后做负向向前看可以找到许多向前看没有找到'== null'的情况。

如果我尝试否定整个表达式,那么这也无济于事,因为它会匹配大多数 C# 代码。

最佳答案

我喜欢正则表达式体操!这是一个带注释的 PHP 正则表达式:

$re = '/# Find all AS, (but not preceding a XX == null).
\bas\b # Match "as"
(?= # But only if...
(?: # there exist from 1-150
[\S\s] # chars, each of which
(?!==\s*null) # are NOT preceding "=NULL"
){1,150}? # (and do this lazily)
(?: # We are done when either
(?= # we have reached
==\s*(?!null) # a non NULL conditional
) #
| $ # or the end of string.
)
)/ix'

这里是 Javascript 风格:

re = /\bas\b(?=(?:[\S\s](?!==\s*null)){1,150}?(?:(?===\s*(?!null))|$))/ig;

这个确实让我的头有点痛……

这是我正在使用的测试数据:

text = r"""    var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1.a == y1.a)

however, not capture
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1 == null)

nor for that matter
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(somethingunrelated == null) {...}
if(x1.a == y1.a)"""

关于regex - 正则表达式负前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921399/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com