Как сопоставить только если персонаж встречается n раз внутри матча? - PullRequest
0 голосов
/ 04 февраля 2019

https://regex101.com/r/gNNlKM/2

Я хочу сопоставить START:test:test:test:asd:xxx:yyy:zzz:12345:END, но, только если : встречается 4 или более раз.

В общем, работает следующее: (START.*?)\d+(:END)Но как я могу получить :{4,} в?

Соответствующая строка может повторяться несколько раз.Например: START:test:test:test:asd:xxx:yyy:zzz:12345:END...START:test:test:test:asd:xxx:yyy:zzz:12345:END... Важно, чтобы совпадение :{4,} применялось только внутри каждого токена START-END.

Sidenote: здесь я использую группы совпадений, так как позже я хочу удалить цифру в этом особом случае.,Но это не должно иметь значения для вопроса, как получить n-кратное совпадение.

1 Ответ

0 голосов
/ 04 февраля 2019

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

(START(?:(?:(?!START)[^:])*:){3,})\d+(:END)

Это будет соответствовать, только если : содержится в строке ровно 4 раза.

Объяснение:

  • (START - запускает группу захвата и сопоставляет START буквально
  • (?:(?:(?!START)[^:])*:){3,}) - сопоставляет некоторый необязательный текст и отклоняет совпадение, если видит буквальное значение START и затем :, где {3,} означает три или более раз.
  • \d+ - соответствует одной или нескольким цифрам
  • (:END) - соответствует еще одной : и END буквально и захватывает его в группе 2

Демо

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