C# несколько строк соответствия
Мне нужен алгоритм поиска строки C#, который может соответствовать множественному вхождению шаблона. Например, если pattern 'AA', а string 'BAAABBB', Regex выдает результат совпадения Index = 1, но мне нужен результат Index = 1,2. Могу ли я заставить Regex дать такой результат?
6 ответов
Используйте шаблон прогнозирования: -
"А (?= А)"
Он находит любой A, за которым следует другой A, не потребляя следующего A. Следовательно, AAA будет соответствовать этому шаблону дважды.
Подводя итог всем предыдущим комментариям:
Dim rx As Regex = New Regex("(?=AA)")
Dim mc As MatchCollection = rx.Matches("BAAABBB")
Это даст результат, который вы запрашиваете.
РЕДАКТИРОВАТЬ:
Вот версия C# (работает с VB.NET сегодня, поэтому я случайно продолжил работу с VB.NET).
Regex rx = new Regex("(?=AA)");
MatchCollection mc = rx.Matches("BAAABBB");
Попробуй это:
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 + ",";
}
Содержимое индекса - это то, что вы ищете с удаленной последней запятой.
Вы действительно ищете подстроки длиной всего два символа? Если это так, то поиск строки из 20 миллионов символов будет медленным, независимо от того, какое регулярное выражение вы используете (или любой другой метод, не являющийся регулярным выражением). Если строка поиска длиннее, механизм регулярных выражений может использовать алгоритм поиска, такой как Бойер-Мур или Кнут-Моррис-Пратт, чтобы ускорить поиск - чем дольше, тем лучше.
Кстати, тип поиска, о котором вы говорите, называется перекрывающимися совпадениями; Я добавлю это к тегам.
Regex.Matches () http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchcollection.aspx