Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как найти все вхождения искомого слова при помощи регулярного выражения? (https://javascript.ru/forum/misc/59223-kak-najjti-vse-vkhozhdeniya-iskomogo-slova-pri-pomoshhi-regulyarnogo-vyrazheniya.html)

khusamov 01.11.2015 20:40

Как найти все вхождения искомого слова при помощи регулярного выражения?
 
Мое регулярное выражение и пример текста https://regex101.com/r/yL0jL5/1

Почему он находит только первое вхождение слова Людовик?
Как сделать, чтобы и последующие тоже нашлись?

Мне нужно найти всех Людовиков после решетки

ruslan_mart 01.11.2015 20:50

khusamov, во первых, нужно убрать жадность. Во вторых, "точка" - любой символ кроме переноса строки.

#[\s\S]*(Людовик)

khusamov 01.11.2015 22:36

Подставил #[\s\S]*(Людовик)
https://regex101.com/r/eD7dE5/1

К сожалению он нашел только последнего Людовика после решетки. А нужно всех найти.

Вот ссылка на полученный результат
https://regex101.com/r/eD7dE5/1

khusamov 01.11.2015 22:39

Вот примерно что нужно получить:
#[\s\S]*?(Людовик)[\s\S]*?(Людовик)[\s\S]*?(Людовик)[\s\S]*

Но нужно найти всех Людовиков после решетки
Причем их количество заранее не известно

ruslan_mart 01.11.2015 23:00

/#((?:[\s\S]*?людовик[a-z]*)+)/gi

khusamov 01.11.2015 23:04

Подставил /#((?:[\s\S]*?людовик[a-z]*)+)/gi
но он нашел один MATCH причем весь текст после решетки...
Вот песочница: https://regex101.com/r/tL1oB6/2

nerv_ 01.11.2015 23:23

Мне вот интересно, вы когда регулярные выражения изучаете, хотя бы приблизительно имеете представление:
1. какие задачи ими решаются
1.1. как именно решаются
2. какие задачи ими не решаются
?
Иными словами для чего они применяются, а для чего НЕ применяются?

'use strict'

let text = `
ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL


ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL


# ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL



ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL`;

let array = text
	.split('\n')
	.filter(x => /^#/.test(x))
    .map(x => x.match(/Людовик[XLVI]+/g));


alert(JSON.stringify(array));

ruslan_mart 01.11.2015 23:31

Цитата:

Сообщение от khusamov
Подставил /#((?:[\s\S]*?людовик[a-z]*)+)/gi
но он нашел один MATCH причем весь текст после решетки...

А как Вы хотите? По отдельности каждый? Если да, то так сделать не получится, только если получить всех "людвиков", а потом их разбить по другому шаблону.

khusamov 01.11.2015 23:39

Программным способ так делять нельзя. У меня библиотека, которая требует на входе регулярное выражение. Библиотеку я переписать не могу. Она требует, чтобы я ОДНИМ регулярным выражением нашел всех Людовиков после решетки.

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


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