Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Найти слово начинающееся на м и состоящее больше чем из 3х букв (https://javascript.ru/forum/misc/80253-najjti-slovo-nachinayushheesya-na-m-i-sostoyashhee-bolshe-chem-iz-3kh-bukv.html)

Ilya_Ru 14.05.2020 14:12

Найти слово начинающееся на м и состоящее больше чем из 3х букв
 
Здравствуйте. Делаю поиск по сайту с подсказкой слов. Бьюсь уже не первый день над регулярным выражением. Никак не выходит составить его правильно.
Есть, к примеру, строка: "мой монитор умолк".
Нужно найти слово "монитор". Использую регулярное выражение:
Код:

/\bм\w*\b/ui
в него попадает слово "мой", это слово мне не нужно.
Корректирую регулярку:
Код:

/\bм\w{3,}\b/ui
в этом случае находит слово "монитор", но если пользователь введёт слово целиком или без последних 2х букв - слово монитор не будет найдено, то есть регулярное выражение:
Код:

/\bмонито\w{3,}\b/ui
не найдет "монитор", а нужно, чтобы нашло...
Колдовство со скобками не давало нужного результата, или я чего-то недопонимаю. По сути, {3,} должно быть всего букв в слове, то есть маска должна быть какой-то примерно такой:
Код:

/\b(монито\w*){3,}\b/ui
но в данном случае она совсем не работает. Помогите, пожалуйста. https://regex101.com/r/QhHHsy/1

рони 14.05.2020 14:22

Цитата:

Сообщение от Ilya_Ru
или я чего-то недопонимаю.

на всякий случай \b это только для английских слов подходит

рони 14.05.2020 14:33

Ilya_Ru,
<script>
   document.write("мой монитор умолк".match(/(?:^|\s+)(м[а-яё]{3,})/ui)[1])
</script>

Ilya_Ru 14.05.2020 14:42

Если проблема была в использовании \b, то слово "монитор" нашлось бы с использованием даже такой регулярки: /монито\w{3,}/ui или /(монито\w*){3,}/ui , или даже без использования \w: /монито[а-я]{3,}/ui но не работает... Здесь проблема в чем-то другом... В чем - я не пойму...
В таком случае слово "монитор", увы, уже идет мимо кассы:
<script>
   document.write("мой монитор умолк".match(/(?:^|\s+)(монито[а-яё]{3,})/ui)[1])
</script>

рони 14.05.2020 14:55

Ilya_Ru,
так если длина шаблона больше 3 что мешает использовать * вместо {3,}

рони 14.05.2020 15:08

Ilya_Ru,
<script>
    let str = 'м', num = Math.max(0, 4 - str.length),
    reg = new RegExp(`(?:^|\\s+)(${str}[а-яё]{${num},})`, 'ui');
    document.write("мой монитор умолк".match(reg)[1])
</script>

Ilya_Ru 14.05.2020 15:36

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

рони 14.05.2020 18:00

Malleys,
:blink:


Часовой пояс GMT +3, время: 00:22.