找到所有if else和else if语句没有括号

时间:2016-04-01 08:01:25

标签: c# regex

我在c#中有一堆代码,这里有一行代码,其中没有括号的if或else语句有一些额外的行会导致错误的行为。我正在寻找一个正则表达式来找到可能发生此问题的所有可能位置,以便我可以手动查找它。

澄清我的意思。在代码中有几个地方(我发现到现在为止),下面的代码是错误的。

if (notInitialized)
    Initialize();
    AdditionalInitializationNotUseThisWhenAlreadyInitialized();

应该是

if (notInitialized) {
    Initialize();
    AdditionalInitializationNotUseThisWhenAlreadyInitialized();
}

我试过这个if\s*\(.*\)([\n\r\s[^{]]*.*);*,但它不仅给了我想要的结果。它也有if (notInitialized) {个部分。我几乎没有使用正则表达式的经验。

如果在代码中没有检查if / else / else,那么如何找到所有这些情况,只是没有花括号的那些?

2 个答案:

答案 0 :(得分:3)

您面临的一个问题是正则表达式在.*上尽可能匹配以找到模式匹配。因此,根据所使用的选项(例如.匹配除了\ n或任何内容之外的任何内容),您将得到令人不满意的结果。

另一个问题是你需要递归匹配,例如跳过尽可能多的)和表达式中嵌套的'('。只有极少数的正则表达式引擎可以做到这一点; .NET幸运的是可以通过“平衡组”但是它是一个棘手且高级的正则表达式应用程序。为了使其正常工作,您还必须识别字符串和字符文字(在引号中),以便不计算这些中的parens。

编辑 .NET的这个正则表达式可以非常可靠地找到这些if和else语句:

\b(if\s*\(((?:[^()"']|'(\\.|[^'\\])'|"(\\.|[^"\\])"|(?<parens>\()|(?<-parens>\)))*(?(parens)(?!))\))|else)\s*[^{\s]

虽然这显示了正则表达式的强大功能,但它非常神秘,正确的方法是使用真正的解析器(例如Roslyn)。

答案 1 :(得分:0)

您可以使用:

if \(.+?\)[^{]*?\n[^{]*?[^{]

如果您没有像这样的格式的ifs

if (notInitialized) 
{
    Initialize();
    AdditionalInitializationNotUseThisWhenAlreadyInitialized();
}

这也有效:

if \(.+?\)[^{]*?\n

如果带有“if”的行在末尾没有{它将检测到它。它也有点短。