我使用以下正则表达式模式来匹配用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}
它是一个疯狂的长正则表达式,但似乎在某种程度上有效。让我解释一下,它有三个名为捕获组,即 HeaderSection , CommentSection 和 FunctionBody .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
}
}
如果我使用上面的正则表达式匹配它,它与第一个if声明匹配,即<; p>
if(Value1==Function(int Z)//This is a Comment.
{
Another function();
}
而是与内部匹配,即
if(Value2==Value1)
{
Some code
}
请指出我做错了什么,或者是否有其他不那么混乱的方式请让我知道,或者纠正正则表达式模式,如果它在某处错了。更多的事情我在C#中使用正则表达式做这一切功能。 提前谢谢。
答案 0 :(得分:1)
(?<header>if\(.*?)(?<comment>//.*?)*\s\n\{(?<functionbody>.*?)\n\}
如果paran以所谓的方式形成,这似乎是一个解决方案。
(?<header>if\(.*?)
将匹配if(
后跟//
部分之前的任何内容,因此匹配
if(Value1==Function(int Z))
然后它移动到(?<comment>//.*?)*\s
,它将匹配//
符号之后的任何内容但是如果没有*
等于零或更多的出现,那么\s
也将匹配{{1}确保它不会超出行尾。
然后(\n\{)(?<functionbody>.*?)(\n\})
会在换行符之后与任何{
匹配并继续前进,直到在换行符之后找到}
。
在
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