C#Regex查找未注释的行

时间:2014-11-10 04:06:46

标签: c# regex comments

我使用((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\r\n]) Regex来识别文件中的所有评论。 (我正在阅读PL / SQL文件,它使用 - 用于单个注释和/ * * /用于多行注释) 这很好,我能够毫无问题地获得所有评论。

我想获得与上述正则表达式不匹配的代码。 所以我使用了正则表达式[^(((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\r\n]))]

 MatchCollection matches = Regex.Matches(text, "[^(((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\r\n])])");
 for (int i = 0; i < matches.Count; i++)
 {
      Console.WriteLine(matches[i].Groups[0].Value);
 }

然后当我尝试运行时说

The file could not be read:
parsing "[^((?:/\*(?:[^*]|(?:\*+[^*/]))*\*+/))|(--[^@].*[
])]" - Too many )'s.

如何获取不是评论的行?

2 个答案:

答案 0 :(得分:1)

尝试使用其他方式:

MatchCollection matches = Regex.Matches(text, "((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\r\n])");
string result=text;
 for (int i = 0; i < matches.Count; i++)
 {
     result=result.Replace(matches[i].Value);
 }

答案 1 :(得分:0)

我能够删除评论并获取未注释的文本,如下所示

public static readonly string BLOCK_COMMENTS = @"/\*(.*?)\*/";
public static readonly string LINE_COMMENTS  = @"--[^@](.*?)\r?\n";
public static readonly string STRINGS        = @"""((\\[^\n]|[^""\n])*)""";

string sWithoutComments = Regex.Replace(textWithComments.Replace("'", "\""), ServerConstant.BLOCK_COMMENTS + "|" + ServerConstant.LINE_COMMENTS + "|" + ServerConstant.STRINGS,
                me =>
                {
                    if (me.Value.StartsWith("/*") || me.Value.StartsWith("--"))
                        return me.Value.StartsWith("--") ? Environment.NewLine : "";
                    return me.Value;
                },
                RegexOptions.Singleline);