C #: цикл по шаблонам подстроки в строке - PullRequest
2 голосов
/ 15 июня 2010

мой шаблон выглядит следующим образом:

{(код)} * * +1004 где код - это число (до 6 цифр) или 2 буквы, за которыми следует число.
Например:

{(45367)}
{(265367)} * * 1 010 {(EF127012)}

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

Ответы [ 5 ]

5 голосов
/ 15 июня 2010

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

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 голос
/ 15 июня 2010

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

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

1 голос
/ 15 июня 2010
\{\(([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 голосов
/ 15 июня 2010
foreach (Match m in Regex.Matches(yourString, @"(?:[A-Za-z]{2})?\d{1,6}"))
{
    Console.WriteLine("Index=" + m.Index + ", Value=" + m.Value);
}
0 голосов
/ 15 июня 2010

пример некомпилированного и непроверенного кода

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 );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...