【问题标题】:i want to find all if statements in C# code which are not followed by brackets. Through regex我想在 C# 代码中找到所有不带括号的 if 语句。通过正则表达式
【发布时间】:2009-01-13 06:43:01
【问题描述】:

我想查找所有if 语句和for 语句后面没有大括号'{'。当您在 if 语句中写一行时,您通常不会将其括在大括号中,所以我想找到所有这些 iffor 语句。

请帮忙!

就像我想捕捉这个陈述

if (childNode.Name == "B")
    return TokenType.Bold;

但不是这些

if (childNode.Name == "B")
{
    return TokenType.Bold;
}

我想用正则表达式来做。

【问题讨论】:

    标签: c# regex code-analysis


    【解决方案1】:

    由于基础数学不允许完美匹配,因此您可以采用很好的启发式方法,例如“查找所有 'if',后跟分号,中间不带大括号:

    /\<if\>[^{]*;/
    

    其中\&lt;\&gt; 是适用于您的正则表达式方言的词首和词尾。还要注意忽略输入中的所有换行符,一些正则表达式处理器需要被告知这样做。


    您可能还想查看StyleCop。这是一个对您的源代码运行大量各种检查的工具。此项检查已存在。

    【讨论】:

      【解决方案2】:

      如果您想要一个 100% 有效的解决方案,那么正则表达式将不符合要求。使用真实代码来绊倒正则表达式太容易了。以下面的正则表达式为例

      "^\s*if\W[^{]*\n\s*[^{]"
      

      这将匹配大部分没有被大括号包围的“if”语句。然而,它很容易被打破。采取以下样本。正则表达式会错误地将这些标记为带有大括号的 if 语句。

      示例 1

      if ( SomeFunction(() => { return 42; }) ) 
      

      示例 2

      /* Big comment
         if ( true ) {
      */
      

      名单还在继续。

      归根结底,如果你想要完美,正则表达式是行不通的。如果您对不太完美的解决方案感到满意,那么上面的正则表达式应该可以解决问题。

      【讨论】:

        【解决方案3】:

        您可以通过 Google 搜索有限状态机来了解为什么无法编写您要求的纯正则表达式。

        另一方面,一些 reg-ex 解释器,比如 Perl 语言,可以引用以前匹配的表达式,这使得理论上实现整个 C# 语法成为可能。不过不要遵循这个想法 ;) David Schmitt 的想法很好。

        【讨论】:

          猜你喜欢
          • 2013-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多