正则表达式模式匹配C#中的if语句?

时间:2013-08-29 22:16:41

标签: c# .net regex

我使用以下正则表达式模式来匹配用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#中使用正则表达式做这一切功能。 提前谢谢。

1 个答案:

答案 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