2

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

请帮忙!

就像我想捕捉这个陈述

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

但不是这些

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

我想用正则表达式来做。

4

3 回答 3

7

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

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

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


你可能也想看看StyleCop。这是一个对您的源代码运行大量各种检查的工具。这张支票已经在那里了。

于 2009-01-13T06:48:42.180 回答
4

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

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

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

示例 1

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

示例 2

/* Big comment
   if ( true ) {
*/

名单还在继续。

底线,如果你想要完美,正则表达式将不起作用。如果您对不太完美的解决方案感到满意,那么上面的正则表达式应该可以解决问题。

于 2009-01-13T07:23:43.683 回答
0

你可以用谷歌搜索有限状态机来找出为什么不能写出你要求的纯正则表达式。

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

于 2009-05-25T10:03:57.910 回答