Почему это регулярное выражение не захватывает отдельные совпадения для каждого <li>? - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь перехватить все, что может произойти между открывающим и закрывающим тегом li, используя следующее регулярное выражение:

/<li[\w\s\!\@\#\$\%\^\&\*\-\_\+\=\~\`\.\,\:\;\"\/\–\?\{\}\[\]\(\)\<\>\ \|\'\\]+<\/li>/g

Я создал регулярное выражение здесь на регулярном выражении 101.

Я не могу понять, почему он не захватывает отдельные элементы li вместо всего текста между первым и последним li. Я не очень знаком со структурой регулярных выражений, поэтому я не уверен, что мне нужно исследовать, чтобы захватить все атрибуты, специальные символы и т. Д., Которые могли бы отображать и по-прежнему завершать отдельные совпадения на закрывающем теге </li>.

UPDATE: Новая демонстрационная версия Regex101, которая лучше отражает примеры, которые я пытаюсь описать (даже мое оригинальное регулярное выражение не справляется с некоторыми из них)

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Я бы использовал:

<li[^>]*>(.*?)<\/li>

Где:

  • [^>]* означает любой символ, который не >

Демо

1 голос
/ 05 апреля 2019

Просто измените + на +?, чтобы стало «лениво» соответствовать как можно меньшему числу символов

<li[\w\s\!\@\#\$\%\^\&\*\-\_\+\=\~\`\.\,\:\;\"\/\–\?\{\}\[\]\(\)\<\>\ \|\'\\]+?<\/li>
                                                                   added this ^ 

Демо: https://regex101.com/r/OTcwF6/3

Также вы можетехотите поместить материал между тегами html в группу <li([...]+?)<\/li>, чтобы вы могли получить этот материал отдельно от самих тегов.Я не знаю, каков ваш вариант использования, но, похоже, вам это может понадобиться.


Редактировать Хорошо, тогда как насчет этого?. соответствует любому символу, поэтому .*? означает «сопоставить что-либо как можно меньше раз или вообще ничего».Это на 1017 * намного проще и, кажется, соответствует всему, что нужно для вашего сложного примера

<li.*?>(.+?)<\/li>

Демо: https://regex101.com/r/OTcwF6/8

0 голосов
/ 05 апреля 2019

Редактировать из-за комментария:

https://regex101.com/r/nR8mbC/4

(<li.*?>)(.*)(<\/li>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...