2014-01-10 2 views
1

Следующее Regex должно обрабатываться на C#:Регулярное выражение в C#, обнаруживающее все имена папок, содержащие [| ]

Я хочу найти все строки, содержащие '[' или ']'.

И он должен соответствовать следующим строкам;

...an folder ] ... 
...and ] another... 
...[so] this is... 
...and [ a few more]... 
...lorem ipsum[... 

следующий код обыкновение компиляции:

string pattern ="\.*(\[|\])\.*"; 
List<string> directoriesMatchingPattern= Util.GetSubFoldersMatching(attachmentDirectory,pattern); 

И реализации:

 public static List<string> GetSubFoldersMatching(string attachmentDirectory, string pattern) 
     { 
      List<string> matching = new List<string>(); 
      foreach (string directoryName in Directory.GetDirectories(attachmentDirectory)) 
      { 
       Match match = Regex.Match(directoryName, pattern, RegexOptions.IgnoreCase); 
       if (match.Success) 
       { 
        matching.Add(directoryName); 
       } 
       else 
       { 
        matching.AddRange(GetSubFoldersMatching(directoryName,pattern)); 
       } 
      } 
      return matching; 
     } 

Ошибка показывает Visual Studio является:

Error Unrecognized escape sequence 

Как это исправить, или как избежать этих символов LY? googling arround вообще не помог.

+3

Поскольку регулярное выражение по умолчанию будет соответствовать в любой точке строки, в начале и конце шаблона нет необходимости в '. *'. Следующее должно работать нормально: 'string pattern = @" [\ [\]] ";' – Iridium

ответ

5

Побег строки шаблона:

string pattern ="\\.*(\\[|\\])\\.*"; 

Или:

string pattern = @"\.*(\[|\])\.*"; 

Для более углубленного взгляд в строки и управляющие последовательности строки смотрите здесь на MSDN.

+1

Обратите внимание, что брекетинг '\. *' S бесполезен в этом сценарии и что '(\ [\ \])' также может быть написано как возможно более простое '[[\]]'. – Jon

2

Вы должны использовать verbatim strings, чтобы сделать escape-код более понятным для регулярных выражений. Я не уверен, что вы пытаетесь сделать с \.*, но Match работает над сопоставлением только части его по умолчанию, поэтому я не думаю, что это необходимо. Я хотел бы использовать следующую схему:

@"(\[|\])" 

Для повышения производительности, создать Regex объект вместо того, чтобы использовать статический метод Regex (так как вы повторно использовать шаблон). И вам не нужно указывать IgnoreCase, так как вас здесь не интересуют буквы, только символы [].

Regex myRegex = new Regex(@"(\[|\])"); 
// later, in loop 
Match match = myRegex.Match(directoryName); 
+0

это упрощает мой код litle больше, спасибо! – MemLeak

0

Опираясь на ответ от Тима S., вы можете создать GetSubFoldersMatching как перегруженной функции, так что вы можете либо передать его существующий Regex объекта или строки, и он будет иметь дело с ним. Повторно используя объект Regex, вы также должны получить небольшое увеличение производительности.

public static List<String> GetSubFoldersMatching(String attachmentDirectory, String pattern) 
{ 
    Regex regex = new Regex(pattern); 
    return GetSubFoldersMatching(attachmentDirectory, regex); 
} 

public static List<String> GetSubFoldersMatching(String attachmentDirectory, Regex regex) 
{ 
    List<String> matching = new List<String>(); 
    foreach (String directoryName in Directory.GetDirectories(attachmentDirectory)) 
    { 
     Match match = regex.Match(directoryName); 
     if (match.Success) 
     { 
      matching.Add(directoryName); 
     } 
     else 
     { 
      matching.AddRange(GetSubFoldersMatching(directoryName, regex)); 
     } 
    } 
    return matching; 
} 
0

Просто добавьте @ в передней части рисунка:

string pattern [email protected]"\.*(\[|\])\.*"; 

и он будет работать.

Вот пример всего.

 List<string> n = new List<string>(); 
     n.AddRange(new string[] { "an folder ] ", 
      "and ] another", 
      "not this one", 
      "[so] this is", 
      "and [ a few more]", 
      "OR num2 either", 
      "lorem ipsum["}); 

     string pattern [email protected]"(\[|\])"; // you don't need your \.* parts 
     List<string> directoriesMatchingPattern = new List<string>(); 
     foreach (string d in n) 
     { 
      if (Regex.Match(d, pattern).Success) 
      { 
       directoriesMatchingPattern.Add(d); 
      } 
     } 
Смежные вопросы