регулярное выражение не дает все возможные совпадения

Мне нужно получить все возможные совпадения для данного регулярного выражения и слова в С#. Но функция Regex.Matches() этого не дает. Например.

Regex.Matches("datamatics","[^aeiou]a[^aeiou]")

возвращает только два совпадения, которые

dat
mat

это не дает «там» как совпадение. Может кто-нибудь объяснить мне, почему он не дает «там» в качестве совпадения и как я могу получить все три?


person Kumar Rajput    schedule 20.06.2013    source источник


Ответы (2)


Вы не можете получить перекрывающиеся совпадения в Regex. Однако у вас есть несколько способов обойти это. Вы можете либо использовать Regex.Match, и указать начальный индекс (используйте цикл для просмотра всей строки), либо вы можете использовать просмотр назад или просмотр вперед, например так:

  (?=[^aeiou]a)[^aeiou]

Это работает, потому что просмотр назад и просмотр вперед не потребляют символы. Он возвращает Match, который содержит индекс совпадения. Вам нужно будет использовать это вместо захватов, поскольку захватывается только один персонаж.

person Mike Precup    schedule 20.06.2013

Используйте это регулярное выражение

(?<=([^aeiou]))a(?=([^aeiou]))

.net поддерживает групповой захват при поиске... ура!

Ваш код будет

var lst= Regex.Matches(input,regex)
              .Cast<Match>()
              .Select(x=>x.Groups[1].Value+"a"+x.Groups[2].Value)
              .ToList();

Теперь вы можете перебрать lst

foreach(String s in lst)
{
     s;//required strings
}
person Anirudha    schedule 20.06.2013
comment
@dasblinkenlight они поддерживаются в .net..:P - person Anirudha; 20.06.2013
comment
Ах, я не заметил вашего маленького трюка - вы добавили захватывающие группы вокруг незахватывающих просмотров вперед и назад! Это сложно, но я думаю, все, что работает, работает. - person Sergey Kalinichenko; 20.06.2013