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