我在c#中有一堆代码,这里有一行代码,其中没有括号的if或else语句有一些额外的行会导致错误的行为。我正在寻找一个正则表达式来找到可能发生此问题的所有可能位置,以便我可以手动查找它。
澄清我的意思。在代码中有几个地方(我发现到现在为止),下面的代码是错误的。
if (notInitialized)
Initialize();
AdditionalInitializationNotUseThisWhenAlreadyInitialized();
应该是
if (notInitialized) {
Initialize();
AdditionalInitializationNotUseThisWhenAlreadyInitialized();
}
我试过这个if\s*\(.*\)([\n\r\s[^{]]*.*);*
,但它不仅给了我想要的结果。它也有if (notInitialized) {
个部分。我几乎没有使用正则表达式的经验。
如果在代码中没有检查if / else / else,那么如何找到所有这些情况,只是没有花括号的那些?
答案 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”的行在末尾没有{它将检测到它。它也有点短。