Regex 正则表达式负前瞻

Regex 正则表达式负前瞻,regex,negative-lookahead,regex-lookarounds,Regex,Negative Lookahead,Regex Lookarounds,我在做一些正则表达式体操。我给自己设置了一个任务,即在合理的空间内,在使用as运算符后不进行空检查的情况下,尝试搜索C#代码。现在我不想解析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 == nu

我在做一些正则表达式体操。我给自己设置了一个任务,即在合理的空间内,在使用as运算符后不进行空检查的情况下,尝试搜索C#代码。现在我不想解析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代码。

{1150}
放在向前看中,并将
替换为
\s\s
(通常,
不匹配换行符)。另外,
\b
可能在
=
附近有误导性

\bas\b(?![\s\S]{1,150}==\s*null\b)
我喜欢regex体操!下面是一个已注释的PHP正则表达式:

$re='/#查找全部为(但不在XX==null之前)。
\bas\b#匹配“as”
(?=#但前提是。。。
(?:#从1到150存在
[\S\S]#字符,每个字符
(?!==\s*null)#不在“=null”之前
){1150}?#(懒洋洋地这样做)
(?:#我们在任何时候都完成了
我们已经到达了
==\s*(?!null)#非null条件
)                #
|$#或字符串的结尾。
)
)/ix'
这里是Javascript风格:

re=/\bas\b(?=(?:[\S\S](?!==\S*null)){1150}(?:(?===\S*(?!null))|$)/ig;
这个确实让我的头有点痛

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

text=r”“”变量x1=x作为简单变量;
变量y1=y,作为简单变量;
如果(x1.a==y1.a)
但是,不是捕获
var x1=x作为简单值;
变量y1=y,作为简单变量;
如果(x1==null)
也不是因为那件事
var x1=x作为简单值;
变量y1=y,作为简单变量;
如果(somethingunrelated==null){…}
如果(x1.a==y1.a)”“

我认为将变量名放入()会有所帮助,这样您就可以将其用作反向引用。像下面这样

\b(\w+)\b\W*=\W*\w*\W*\bas\b[\s\S]{1,150}(?!\b\1\b\W*==\W*\bnull\b)

问题不清楚。你到底想要什么?我很遗憾,但我还是不明白,在阅读了无数次问题和评论之后

代码必须是C#吗?用Python?其他的?关于这一点没有任何迹象

仅当(…==…)行在
var…=…]块之后时,才需要匹配吗

或者,如果(…==…)
行不停止匹配,则块和
行之间可能存在异构行

我的代码将第二个选项视为true

if(…==null)
行之后的
if(…==…)
行是否停止匹配

无法理解它是“是”还是“否”,我定义了两个正则表达式来捕获这两个选项

我希望我的代码足够清晰,能够回应您的关注

它是用Python编写的

import re

ch1 ='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1.a == y1.a)
1618987987849891
'''

ch2 ='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
uydtdrdutdutrr
if(x1.a == y1.a)
3213546878'''

ch3='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1 == null)
165478964654456454'''

ch4='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
hgyrtdduihudgug
if(x1 == null)
165489746+54646544'''

ch5='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(somethingunrelated == null ) {...}
if(x1.a == y1.a)
1354687897'''

ch6='''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
ifughobviudyhogiuvyhoiuhoiv
if(somethingunrelated == null ) {...}
if(x1.a == y1.a)
2468748874897498749874897'''

ch7 = '''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
if(x1.a == y1.a)
iufxresguygo
liygcygfuihoiuguyg
if(somethingunrelated == null ) {...}
oufxsyrtuy
'''

ch8 = '''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
tfsezfuytfyfy
if(x1.a == y1.a)
iufxresguygo
liygcygfuihoiuguyg
if(somethingunrelated == null ) {...}
oufxsyrtuy
'''

ch9 = '''kutgdfxfovuyfuuff
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
tfsezfuytfyfy
if(x1.a == y1.a)
if(somethingunrelated == null ) {...}
oufxsyrtuy
'''

pat1 = re.compile(('('
                   '(^var +\S+ *= *\S+ +as .+[\r\n]+)+?'
                   '([\s\S](?!==\s*null\\b))*?'
                   '^if *\( *[^\s=]+ *==(?!\s*null).+$'
                   ')'
                   ),
                  re.MULTILINE)

pat2 = re.compile(('('
                   '(^var +\S+ *= *\S+ +as .+[\r\n]+)+?'
                   '([\s\S](?!==\s*null\\b))*?'
                   '^if *\( *[^\s=]+ *==(?!\s*null).+$'
                   ')'
                   '(?![\s\S]{0,150}==)'
                   ),
                  re.MULTILINE)


for ch in (ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9):
    print pat1.search(ch).group() if pat1.search(ch) else pat1.search(ch)
    print
    print pat2.search(ch).group() if pat2.search(ch) else pat2.search(ch)
    print '-----------------------------------------'
结果

>>> 
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.a == y1.a)
-----------------------------------------
var x1 = x as SimpleRes;
var y1 = y as SimpleRes;
uydtdrdutdutrr
if(x1.a == y1.a)

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

None
-----------------------------------------
None

None
-----------------------------------------
None

None
-----------------------------------------
None

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

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

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

None
-----------------------------------------
>>> 

让我尝试重新定义您的问题:

  • 查找“as”赋值——您可能需要一个更好的正则表达式来查找实际赋值,并且可能希望存储分配的表达式,但是现在让我们使用“\bas\b”
  • 如果在150个字符内看到
    If(…==null)
    ,则不匹配
  • 如果在150个字符内没有看到
    If(…==null)
    ,请匹配
  • 您的表达式
    \bas\b.{1150}(?!\b==\s*null\b)
    将无法工作,因为前面有负面展望。正则表达式总是可以向前或向后跳过一个字母,以避免这种消极的向前看,并且即使存在
    if(…==null)
    时也会进行匹配

    正则表达式真的不擅长不匹配的东西。在这种情况下,最好尝试将“as”赋值与150个字符内的“if==null”检查相匹配:

    \bas\b.{1,150}\b==\s*null\b
    
    然后取消检查:
    if(!regex.match(text))…

    (?s:\s+as\s+(?!.{0,150}==\s*null\b))
    
    我正在使用
    ?s:
    激活单线选项。如果你愿意,你可以把它放在正则表达式的选项中。我要补充的是,我将
    \s
    放在
    as
    周围,因为我认为
    as
    周围只有空格是“合法的”。你可以把
    \b
    像这样

    (?s:\b+as\b(?!.{0,150}==\s*null\b))
    

    请注意,
    \s
    可能会捕获非“有效空格”的空格。它的定义是
    [\f\n\r\t\v\x85\p{Z}]
    其中
    \p{Z}
    是加号。

    你不能使用合适的C#解析器吗?我在开始时说“我在做一些正则表达式体操。我给自己设定了一个任务,试图搜索C#”…这就像看足球和想“这就像做体操一样”?:-)我无法让您的想法发挥作用,它仍然在我的搜索结果中包含上面的第二个示例。这个正则表达式:
    \bas\b(?![\s\s]{1150}=\s*null\b)
    非常接近,但与第一组“应该匹配”测试数据中的第二个不匹配。@ridgerunner它对Python适用吗?我没有测试的C#设置。简短回答,是的。我过去常常编写我的大部分正则表达式。它模拟了许多不同的正则表达式风格。我刚刚检查过,是的,您的正则表达式在Python模式下的行为是相同的。我还用Python3.0.1编写了一个测试脚本,得到了相同的结果。我使用的测试数据是所有三个样本的文本和两个注释之间的文本;i、 e.包括
    但不包括captur