【问题标题】: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 语句中写一行时,您通常不会将其括在大括号中,所以我想找到所有这些 if 和 for 语句。
请帮忙!
就像我想捕捉这个陈述
if (childNode.Name == "B")
return TokenType.Bold;
但不是这些
if (childNode.Name == "B")
{
return TokenType.Bold;
}
我想用正则表达式来做。
【问题讨论】:
标签:
c#
regex
code-analysis
【解决方案1】:
由于基础数学不允许完美匹配,因此您可以采用很好的启发式方法,例如“查找所有 'if',后跟分号,中间不带大括号:
/\<if\>[^{]*;/
其中\< 和\> 是适用于您的正则表达式方言的词首和词尾。还要注意忽略输入中的所有换行符,一些正则表达式处理器需要被告知这样做。
您可能还想查看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 的想法很好。