выражения - c# regex replace group



Перекрытие совпадений в Regex (2)

AFAIK, нет простого регулярного способа сделать это сразу (т. Е. Вернуть три захвата, которые вы запрашиваете без цикла).

Теперь вы можете найти шаблон один раз и выполнить цикл поиска, начинающийся со смещения (найденная позиция + 1). Следует комбинировать использование регулярных выражений с простым кодом.

[EDIT] Отлично, я проиграл, когда я в основном сказал, что Ян показал ...
[РЕДАКТИРОВАТЬ 2] Чтобы быть ясным: ответ Яна лучше. Не более точно, но, безусловно, более подробно, он заслуживает выбора. Я просто не понимаю, почему мой занижен, так как я до сих пор не вижу в нем ничего неправильного. Не очень, просто раздражает.

Кажется, я не могу найти ответ на эту проблему, и мне интересно, существует ли она. Упрощенный пример:

Рассмотрим строку «nnnn», где я хочу найти все совпадения «nn», но также и те, которые перекрываются друг с другом. Таким образом, регулярное выражение предоставит следующие 3 совпадения:

  1. nn nn
  2. n n n n
  3. nn nn

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


Возможным решением может быть использование положительного взгляда :

(?<=n)n

Это даст вам конечную позицию:

  1. * П *** п ** пп
  2. п * п *** п ** п
  3. пп * п *** п **

Как упоминалось Тимоти Хури , позитивный взгляд более интуитивно понятен

Я предпочел бы его предложение (?=nn)n в более простой форме:

(n)(?=(n))

Это будет ссылаться на первую позицию строк, которые вы хотите, и будет захватывать второе n в группе (2) .

Это происходит потому, что:

  • Любое допустимое регулярное выражение может использоваться внутри lookahead.
  • Если он содержит скобки для скобок, будут сохранены обратные ссылки .

Таким образом, группа (1) и группа (2) будут захватывать все, что 'n' представляет (даже если это сложное регулярное выражение).





overlap