2014-11-10 3 views
0

Я использую ((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\r\n]) Regex, чтобы идентифицировать все комментарии в файле. (Я читаю файл PL/SQL, и он использует - для одиночных комментариев и/* */для многострочных комментариев) Это прекрасно работает, и я могу получить все комментарии без каких-либо проблем.C# Regex найти строку, которая не комментируется

Я хочу получить код, который не соответствует приведенному выше регулярному выражению. Так что я использовал Regex [^(((?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/))|(--[^@].*[\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. 

Как я могу получить линию, которые не являются комментарии?

+1

'[^ ...]' класс символов. Он не будет распознавать контент как нечто иное, кроме класса символа или символа внутри. – nhahtdh

+0

@nhahtdh Если это так, я могу сопоставить код без комментария? –

+0

Надеюсь, ваш SQL не содержит 'SELECT 'some-string' FROM [some-table]' ;-) –

ответ

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); 
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); 
} 
Смежные вопросы