2017-01-20 2 views
0

Я ищу регулярное выражение, чтобы соответствовать этим правилам:Regex для включения одной строки и исключения второй строки?

  1. Содержит The contoller for path
  2. Содержит апостроф ('), за которым следует любое количество символов
  3. Символы должны не торцевыми в .cs
  4. Там должен быть второй апостроф
  5. Содержит was not found or does not implement IController

Пример ввода:

Сообщение исключения: Контроллер для пути '/MyApplication/Scripts/jquery-1.10.2.min.js' не найден или не реализует IController.

Сообщение об исключении: Контроллер для пути '/MyApplication/Content/bootstrap.min.css' не был найден или не реализует IController.


Я не работал на нашем основном приложении регистрации ошибок библиотеки/интеграции в нашем приложении, но я получаю десятки этих файлов журналов, рассказывающие мне, что мой CSS и Javascript не реализуют IController. Не могу понять, почему поэтому я написал что-то, чтобы просто удалить их в среднее время. Это немного более «жесткой», чем хотелось бы, хотя:

string[] regexExpressions = { 
      "(The controller for path)(\\s)'([^']*?)[.]js'(?:$|\\s)(was not found or does not implement IController.)", 
      "(The controller for path)(\\s)'([^']*?)[.]css'(?:$|\\s)(was not found or does not implement IController.)" 
      }; 

List<Regex> regexList = new List<Regex>(); 

foreach (string expression in regexExpressions) 
    regexList.Add(new Regex(expression); 

//Loop over each file in a directory 
//Nested loop to iterate over my List<Regex> 
// to compare every file against every regex 
// building a list any time I find a match 

//Delete files which match any one of my regex 

(Это немного более сложным, чем это, но это важный материал)

Я просто возвращаюсь и добавляя дополнительные регулярные выражения к string[] regexExpressions, поскольку я замечаю все больше и больше типов несущественных журналов ошибок. Тем не менее, я не хочу изменять этот инструмент каждый раз, когда я нахожу новый тип файла, который вызывает ошибку, о которой я не забочусь. Вначале я написал его только для * .js, а затем заметил, что * .css тоже их выбрасывал, и теперь сегодня я нашел несколько файлов * .map с таким же сообщением об ошибке ....

Так как я могу его изменить искать одиночную цитату, проделанную чем угодно, кроме .cs?

Я думаю, что, возможно, мне удастся пропустить первые два требования в моем списке выше, важная часть на самом деле просто <not a .cs file>' was not found found or does not implement IController. Я просто включил все другие вещи до этого, так как мне нравится быть максимально явным и избегать риска случайного удаления чего-то, что я, возможно, не хотел бы удалить.

+0

Приведите пример ввода строки. – jdweng

+0

@jdweng Обновлен мой вопрос, чтобы включить 2 образца текстов – sab669

ответ

1

Следующее регулярное выражение исключает файлы CS:

'[^']+?\.(?!cs')[^'.]+?' 

Это выражение проверяет, является ли текст между одиночными кавычками содержит по меньшей мере один символ, точку, не следует cs', но, по крайней мере один символ. Он также может соответствовать линиям, где расширение начинается с cs.

Группа регулярных выражений (?! что-то) называется негативным взглядом. Вы можете прочитать немного больше информации here.

Если вы хотите, чтобы обеспечить предложение, вы можете добавить его вокруг так:

The controller for path '[^']+\.(?!cs')[^'.]+?' was not found or does not implement IController\. 

Вы можете посмотреть его в действии here или here.

+0

Beautiful; работает на меня! Благодарю. Знаете ли вы название этого бита, который вы изменили? '(?! Cs ')'? Я не знаю, для чего вызывается этот специфический синтаксис, чтобы прочитать его/понять лучше. – sab669

+1

@ sab669 Я рад, что это сработало. Я обновил свой ответ относительно вашего вопроса. :) – Niitaku

0

Это должно работать:

  string[] inputs = { 
 
       "The controller for path '/MyApplication/Scripts/jquery-1.10.2.min.js' was not found or does not implement IController.", 
 
       "The controller for path '/MyApplication/Content/bootstrap.min.css' was not found or does not implement IController." 
 
      }; 
 

 
      string pattern = @"The controller for path '(?'path'.+)\.(?'ext'.+)'"; 
 

 
      foreach (string input in inputs) 
 
      { 
 
       
 
       Match match = Regex.Match(input, pattern); 
 

 
       string ext = match.Groups["ext"].Value; 
 

 
       if (match.Success && match.Groups["ext"].Value != "cs") 
 
       { 
 
        Console.WriteLine(match.Groups["path"].Value + "." + match.Groups["ext"].Value); 
 
       } 
 
      } 
 
      Console.ReadLine();

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