2012-06-14 2 views
0

Первое, что я могу использовать только C# regex, поэтому предлагать другие языки или не-regex решение не поможет. Теперь вопрос.C# Regex Найти все строки ожидать в строке отладки

Я должен найти всю строку в коде (пару тысяч файлов). Там в основном 6 случаев:

string a = "something"; // output" "something" 
    sring b = "something else" + " more"; // output: "something else" and " more" 
    Print("this should match"); // output: "this should match" 
    Print("So" + "should this"); // output: "So" and "should this" 
    Debug("just some bebug text"); // output: this should not match 
    Debug("more " + "debug text"); // output: this should not match 

Регулярное выражение должно соответствуют первой 4 (мне нужно только, что находится внутри кавычек, и печати могут быть любые другие функции, а)

До сих пор у меня есть это, который возвращает ничего в кавычках:

".*?" 
+1

Я предложил бы получить инструмент регулярных выражений, чтобы помочь вам с вашей домашней работы. Я использую expresso (http://www.ultrapico.com/Expresso.htm). – tsells

+0

Можете ли вы дать некоторые данные образца? Или вы просто хотите исключить любую строку с '' debug'''? – nhahtdh

+0

Результат выше должен быть: «что-то», «что-то еще», «больше», «это должно совпадать», «так», «если это». То, что я не хочу, это «просто текст bebug», «больше» и «текст отладки» – Raza

ответ

1

Короче:@"^(?!Debug\("")([^""]*""(?<Text>[^""]*)"")*.*$"

Что лань s:

  • Не соответствует строке, если она начинается с Debug("
  • прогонов вдоль струны, пока она не встречает первый ", и проходит мимо него
    • Если в " не было найдено и он дошел до конца строки, он остановится.
  • Запуск «Запись» в группе по имени Text
  • пробежек вдоль строки, пока он не встречает следующий ", останавливает запись, и проходит мимо него.
  • Возврат к шагу 2

Результат: У вас есть все строки между "-х в группе под названием Text.

Что осталось для вас сделать: превратить его в многострочный регулярных выражениях и поддержки whitepsaces (\s) перед Debug как лучший фильтром.

Далее пример использования и тестирования:

var regex = new Regex(@"^(?!Debug\("")([^""]*""(?<Text>[^""]*)"")*.*$"); 

var inputs = new[] 
       { 
        @"string a = ""something"";", 
        @"sring b = ""something else"" + "" more"";", 
        @"Print(""this should match"");", 
        @"Print(""So"" + ""should this"");", 
        @"Debug(""just some bebug text"");", 
        @"Debug(""more "" + ""debug text"");" 
       }; 

foreach (var input in inputs) 
{ 
    Console.WriteLine(input); 
    Console.WriteLine("====="); 

    var match = regex.Match(input); 

    var captures = match.Groups["Text"].Captures; 

    for (var i = 0; i < captures.Count; i++) 
    { 
     Console.WriteLine(captures[i].Value); 
    } 

    Console.WriteLine("====="); 
    Console.WriteLine(); 
} 

Выход:

string a = "something"; 
===== 
something 
===== 

sring b = "something else" + " more"; 
===== 
something else 
more 
===== 

Print("this should match"); 
===== 
this should match 
===== 

Print("So" + "should this"); 
===== 
So 
should this 
===== 

Debug("just some bebug text"); 
===== 
===== 

Debug("more " + "debug text"); 
===== 
===== 
+0

Что касается вашего комментария, я неправильно понял вопрос, поэтому я удалю свой ответ. О части «только регулярное выражение» я предлагаю любое эквивалентное хорошее решение, которое проще, чем регулярное выражение, поскольку он кодирует программу извлечения в C#. – nhahtdh

+0

@nhahtdh Полностью согласен, но 'я могу использовать только C# regex' - звучит как домашнее задание - нечего делать. Это потребности ОП. – SimpleVar

+0

@YoryeNathan, спасибо за помощь.Он работает, но мне все еще трудно разобраться с тем, как вы туда попали. Из того, что я понимаю, '^ (?! Debug \ (") ', чтобы избавиться от' Debug (''. '([^"] * "(? [^"] *) ") *' для фактических строк , с '[^"] * ', чтобы избавиться от' '', а затем '. * $' to comsume ');' в конце строки. Я использую [link] (http://rubular.com/), чтобы проверить, когда regex, когда я пишу один, и указанное выше регулярное выражение все еще не работает там. Я предполагаю, что у ruby ​​есть разные правила для регулярного выражения? – Raza

Смежные вопросы