Регулярное выражение, подтверждающее, что слово встречается ровно 2 раза

У меня есть каша из текста из символов. Как пример:

3242ваывдл3r3map235map4346{

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


Ответы (3 шт):

Автор решения: Qwertiy
^(((?!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">

→ Ссылка
Автор решения: dIm0n

Вот так вот:

^((?!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
→ Ссылка
Автор решения: PotroNik

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 оставив только полное совпадение

→ Ссылка