@LShAnka
начинающий программист-любитель

Какое составить регулярное выражение для отбора из словаря слов по определенному шаблону?

Нужно выбрать из словаря слова, в которых сначала идет одна согласная из набора [бвгджзк], затем одна или более любых гласных, далее снова одна согласная из набора [бвгджзк], а потом произвольное количество любых букв. Написала вот что:
var str = 'человек время дело жизнь день рука раз работа слово место лицо друг';
str=str.match(/[бвгджзк]{1}[аяеэюуёоиы]{1}[бвгджзк]{1}[а-яА-ЯёЁ]{0,}/gi)
console.log(str)

Получаю Array(2) ["век", "жизнь"]. Почему выдает фрагмент слова?
  • Вопрос задан
  • 85 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Почему выдает фрагмент слова?

Потому что разделение строки по словам - оно исключительно у вас в голове, в вашем регулярном выражении ничего про границы слов нет. Есть спецсимвол \b, обозначающий границы слов, но он в данном случае неприменим, поскольку у вас тут кириллические символы. Можно представить границу слова как начало строки или пробельный символ или конец строки. Типа так:

str.match(/(^|\s)[бвгджзк][аяеэюуёоиы]+[бвгджзк][а-яё]*($|\s)*?/gi).map(n => n.trim())

Но вообще - как-то не очень понятно, зачем такие сложности. Вы говорите, у вас какой-то словарь - ну так поместите слова в массив, и проверяйте на точное соответствие, волноваться о границах слов будет не нужно.
Ответ написан
bask
@bask
У вас берётся вхождение символов в слово.
А нужно указать, что надо стартовать с указанных символов.
str=str.match(/(\s|^)[бвгджзк]{1}[аяеэюуёоиы]{1}[бвгджзк]{1}[а-яА-ЯёЁ]{0,}/gi)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Почему выдает фрагмент слова?

Потому что вы не проверяете на границы слова. Вообще, проверка границы слова для кириллицы это тот еще квест. Проще разбить ваш список по пробелам, проверить каждое слово отдельно и склеить обратно.

https://regex101.com/r/PprlqG/1

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы