2010-06-15 2 views
2

моего шаблона выглядит следующим образом:C# Цикл по подстрокам узоров в виде строке

{(код)}
, где код число (до 6 цифр), или 2 письмо с последующим номером ,
Например:

{(45367)}
{(265367)}
{(EF127012)}

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

+0

Регулярное выражение библиотека будет помнить места для каждого матча в MatchCollection. Что значит тип? Все числа против букв? Затем перебирайте совпадения и проверяйте буквы ... –

ответ

5

Что вы имеете в виду делать все еще может быть сделано с регулярными выражениями. Попробуйте следующее ...

Regex regex = new Regex(@"\{\(([A-Z]{2}\d{1,6}|\d{1,6})\)\}"); 
String test = @"my pattern is the following: 

Я хочу, чтобы найти все вхождения в длинной череде

var matches = regex.Matches(test); 
foreach (Match match in matches) 
{ 
    MessageBox.Show(String.Format("\"{0}\" found at position {1}.", match.Value, match.Index)); 
} 

Я надеюсь, что помогает.

1
\{\(([A-Z]{2})?\d{1,6}\)\} 
 
\{   # a literal { character 
\(   # a literal (character 
(   # group 1 
    [A-Z]{2} # letters A-Z, exactly two times 
)?   # end group 1, make optional 
\d{1,6}  # digits 0-9, at least one, up to six 
\)   # a literal) character 
\}   # a literal } character 
+0

И что мне делать с этим регулярным выражением? Как его использовать, чтобы получить позицию каждого матча? – ilann

+1

Есть буквально * тысячи * примеров использования регулярных выражений в C#, на этом сайте и везде. Их нелегко найти. – Tomalak

1

Используйте MatchEvaluator с регулярным выражением, чтобы получить положение и тип матча.

http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Augmenting_the_Basic_String_Replacement_Function

+0

Единственными методами 'Regex', которые принимают аргумент' MatchEvaluator', являются различные перегрузки 'Replace', поэтому это предложение действительно применимо только в том случае, если OP в конечном счете хочет выполнить какую-то замену. – LukeH

0

Неоткомпилированный и непроверенного образец кода

public void LogMatches(string inputText) 
{ 
    var @TomalaksPattern = @"\{\(([A-Z]{2})?\d{6}\)\}"; // trusting @Tomalak on this, didn't verify 
    MatchCollection matches = Regex.Matches(inputText, @TomalaksPattern); 
    foreach(Match m in matches) 
    { 
     if(Regex.Match(m.Value, @"\D").Success) 
      Log("Letter type match {0} at index {1}", m.Value, m.Index); 
     else 
      Log("No letters match {0} at index {1}", m.Value, m.Index); 
    } 
} 
0
foreach (Match m in Regex.Matches(yourString, @"(?:[A-Za-z]{2})?\d{1,6}")) 
{ 
    Console.WriteLine("Index=" + m.Index + ", Value=" + m.Value); 
} 
Смежные вопросы