Регулярное выражение, подтверждающее, что слово встречается ровно 2 раза
У меня есть каша из текста из символов. Как пример:
3242ваывдл3r3map235map4346{
Мне нужно написать такую регулярку, которая будет проверять что слово map в этой каше встречается ровно два раза. Не больше и не меньше. Каша вокруг слов map безразмерная и может содержать любое количество символов и пробелов, кроме, разумеется, самого слова map.
Ответы (3 шт):
^(((?!map).)*map){2}((?!map).)*$
input { outline: none !important; box-sizing: border-box; width: 100%; }
:valid { border: 1px solid green; }
:invalid { border: 1px solid red; }
<input autofocus pattern="^(((?!map).)*map){2}((?!map).)*$" required value="3242ваывдл3r3map235map4346">
Вот так вот:
^((?!map).)*map((?!map).)*map((?!map).)*$
Тест https://regex101.com/r/xEvY9c/2
3242ваывдл3r3map235map4346{
3242ваывдл3r3map235map434map6{
3242ваывдл3r3ma235map4346{
mapmap
map
map map m a p 123
update в конце ответа
Хоть правильный ответ уже дан, я тоже поучаствую:
(?=(?:.*(map)){2})(?!(?:.*\1){3}).*
Ключи ставить нужно захватывая новую строку, обычно это single line s
Схема работы проста:
.* - любое количество любых символов
(?=(?:.*(map)){2}) - проверяем что повторяется необходимая нам последовательность 2 раза
(?!(?:.*\1){3}) - проверяем что наше совпадение не встречается трижды, увеличивать квантификацию раскрыв диапазон в принципе лишняя трата системного времени.
Из плюсов вижу только то что менять слово-шаблон нужно в одном месте и немного меньше план подбора выходит, но не сильно.
upd: Кстати, есть смысл добавить в шаблон границу слова \b
(?=(?:.*\b(map)\b){2})(?!(?:.*\b\1\b){3}).* исключив при этом maptext,textmap и textmaptext оставив только полное совпадение