要匹配C#中if语句的正则表达式模式
本文关键字:语句 正则表达式 模式 if | 更新日期: 2023-09-27 18:29:38
我使用以下正则表达式模式来匹配以C#样式编写的if语句;
'b[if]{2}'b[ ]?'({1}(?<HeaderSection>[ 'w's'a't'='.'@'#'$'%'&a-zA-Z0-9'(')';'/'"'''[']'*]*)'){1}(?<CommentSection>['s'a'w't a-zA-Z0-9'/'.]*)['r'n]*'{{1}(?<FunctionBody>['r'n 'a's'wa-zA-Z0-9'(')'"'.';':]*)['r'n]*'}{1}
这是一个疯狂的长regex模式,但似乎在某种程度上起了作用。让我解释一下,它有三个命名的捕获组,即HeaderSection、CommentSectionunctionBody。HeaderSection捕获if语句的起始和结束括号之间的匹配,例如来自下面的语句;
if(Value1==Function(int Z))
它捕捉;
Value1==Function(int Z)
类似地,CommentSection捕获了右括号后的注释(如果有的话),因此来自下面的语句;
if(Value1==Function(int Z))//This is a Comment.
它捕获
//This is a Comment.
FunctionBody捕获{和}之间的任何内容,例如下面的代码;
if(Value1==Function(int Z))//This is a Comment.
{
This is the
space for
function body.
}
它捕捉到"这是功能体的空间。"这就是正则表达式匹配内容的解释。现在它的问题是,如果我有这样的函数;
if(Value1==Function(int Z)//This is a Comment.
{
if(Value2==Value1)
{
Some code
}
}
如果我使用上面的regex匹配它,它与第一个if声明不匹配,即;
if(Value1==Function(int Z)//This is a Comment.
{
Another function();
}
而是匹配内部的,即
if(Value2==Value1)
{
Some code
}
请指出我做错了什么,或者如果有其他不那么混乱的方法,请告诉我,或者如果regex模式在某个地方出错,请更正它。还有一件事,我在C#中使用正则表达式函数来完成这一切。提前谢谢。
(?<header>if'(.*?)(?<comment>//.*?)*'s'n'{(?<functionbody>.*?)'n'}
如果paran以假定的方式格式化,这似乎是一个解决方案。
(?<header>if'(.*?)
将匹配if(
,然后是//
部分之前的任何内容,因此它将匹配
if(Value1==Function(int Z))
则它移动到(?<comment>//.*?)*'s
,该CCD_4将匹配//
符号之后的任何符号,但如果没有*
等于零或更多出现,则也将匹配,并且's
确保它不超过行末端。
则CCD_ 8匹配换行之后的任何CCD_。
在中
var x = 0
if(Value1==Function(int Z))//This is a Comment.
{
if(Value2==Value1)
{
Some code
}
}
var y = 0
if(y == x)
{
x = y + 1
}
它将匹配以下组:
header: if(Value1==Function(int Z))
comment: //This is a Comment.
functionbody:
if(Value2==Value1)
{
Some code
}
header: if(y == x)
functionbody:
x = y + 1