C # несколько строк соответствия - PullRequest
5 голосов
/ 08 января 2009

Мне нужен алгоритм поиска строки C #, который может соответствовать множественному вхождению шаблона. Например, если pattern 'AA', а string 'BAAABBB', Regex выдает результат совпадения Index = 1, но мне нужен результат Index = 1,2. Могу ли я заставить Regex дать такой результат?

Ответы [ 6 ]

13 голосов
/ 08 января 2009

Используйте шаблон прогнозирования: -

"А (? = A)"

Это находит любой A, за которым следует другой A, не потребляя следующего A. Следовательно, AAA будет соответствовать этому шаблону дважды.

4 голосов
/ 08 января 2009

Подведем итог всем предыдущим комментариям:

Dim rx As Regex = New Regex("(?=AA)")
Dim mc As MatchCollection = rx.Matches("BAAABBB")

Это даст результат, который вы запрашиваете.

EDIT:
Вот версия C # (работает с VB.NET сегодня, поэтому я случайно продолжил работу с VB.NET).

Regex rx = new Regex("(?=AA)");
MatchCollection mc = rx.Matches("BAAABBB");
0 голосов
/ 10 января 2009

Вы действительно ищете подстроки длиной всего два символа? Если это так, то поиск строки из 20 миллионов символов будет медленным, независимо от того, какое регулярное выражение вы используете (или любой другой метод, не являющийся регулярным выражением). Если строка поиска длиннее, механизм регулярных выражений может использовать алгоритм поиска, такой как Бойер-Мур или Кнут-Моррис-Пратт, чтобы ускорить поиск - чем дольше, тем лучше.

Кстати, тип поиска, о котором вы говорите, называется перекрывающиеся совпадения ; Я добавлю это к тегам.

0 голосов
/ 08 января 2009

Попробуйте это:

       System.Text.RegularExpressions.MatchCollection  matchCol;
       System.Text.RegularExpressions.Regex regX = new System.Text.RegularExpressions.Regex("(?=AA)");

        string index="",str="BAAABBB"; 
        matchCol = regX.Matches(str);
        foreach (System.Text.RegularExpressions.Match mat in matchCol)
            {
                index = index + mat.Index + ",";
            }                       

Содержимое индекса - это то, что вы ищете с последней удаленной запятой.

0 голосов
/ 08 января 2009
0 голосов
/ 08 января 2009

Любое регулярное выражение может дать массив MatchCollection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...