我在c#中有一堆代码,在这些代码行中,不带圆括号的if或else语句有一些额外的行,这会导致错误行为。我正在寻找一个正则表达式,以找到所有可能发生这个问题的地方,以便我可以手动查找它。
来澄清我的意思。代码中有一些地方(到目前为止我发现),下面的代码是错误的。
if (notInitialized)
Initialize();
AdditionalInitializationNotUseThisWhenAlreadyInitialized();
这应该是
if (notInitialized) {
Initialize();
AdditionalInitializationNotUseThisWhenAlreadyInitialized();
}
我试过这个if\s*\(.*\)([\n\r\s[^{]]*.*);*
,但它不仅给了我想要的结果。它也有if (notInitialized) {
部件。我几乎没有使用regex的经验。
在代码中,如果没有检查所有这些情况,只检查那些没有大括号的情况,我怎么找到这些情况呢?
发布于 2016-04-01 08:09:03
您面临的一个问题是正则表达式在.*
上尽可能多地匹配以找到模式匹配。因此,根据所使用的选项(例如,.
匹配除\n以外的任何东西),您将得到不满意的结果。
另一个问题是,您需要递归匹配,例如跳过嵌套的'(‘)表达式中的)
。只有极少数的regex引擎能够做到这一点;幸运的是,.NET可以通过“平衡组”来实现,但是regex的应用程序非常复杂,而且非常高级。此外,要使其正确工作,还必须识别字符串和字符文字(以引号表示),因为在这些字符串和字符中不计算父母。
编辑这个用于.NET的正则表达式应该非常可靠地找到这些if和.NET语句:
\b(if\s*\(((?:[^()"']|'(\\.|[^'\\])'|"(\\.|[^"\\])"|(?<parens>\()|(?<-parens>\)))*(?(parens)(?!))\))|else)\s*[^{\s]
虽然这显示了regexes的强大功能,但它非常神秘,正确的方法是使用真正的解析器(比如Roslyn)。
发布于 2016-04-01 08:22:06
你可以用这个:
if \(.+?\)[^{]*?\n[^{]*?[^{]
如果您没有这种格式的ifs
if (notInitialized)
{
Initialize();
AdditionalInitializationNotUseThisWhenAlreadyInitialized();
}
这也适用于:
if \(.+?\)[^{]*?\n
它将检测,如果一行与" if“没有{在末尾。它也稍微短一点。
https://stackoverflow.com/questions/36351067
复制相似问题