0

我正在使用以下正则表达式模式来匹配以 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}

这是一个疯狂的长正则表达式模式,但似乎在某种程度上起作用。让我解释一下,它有三个命名的捕获组,即HeaderSectionCommentSectionFunctionBody。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 声明不匹配,即;

if(Value1==Function(int Z)//This is a Comment.
{
Another function();
}

而是匹配内部的,即

  if(Value2==Value1)
  {
    Some code
  }

请指出我做错了什么,或者如果有另一种不那么混乱的方法,请告诉我,或者如果某处错误,请纠正正则表达式模式。我正在使用正则表达式函数在 C# 中做这一切的另一件事。提前致谢。

4

1 回答 1

1
(?<header>if\(.*?)(?<comment>//.*?)*\s\n\{(?<functionbody>.*?)\n\}

如果 paran 以假定的方式形成,这似乎是一个解决方案。

(?<header>if\(.*?)

将匹配if(后面的任何内容,但在该//部分之前,因此它将匹配

if(Value1==Function(int Z))

然后它继续前进(?<comment>//.*?)*\s,将匹配符号后面的任何内容,//但如果没有任何内容*等于零次或多次出现,也将匹配,并\s确保它不会超出行尾。

然后在换行符之后(\n\{)(?<functionbody>.*?)(\n\})匹配任何{内容并继续进行,直到在}换行符之后找到 a。

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
于 2013-10-07T15:49:11.260 回答