为什么此正则表达式不为每个<li>抓取单独的匹配项?

时间:2019-04-05 18:46:15

标签: javascript regex

我正尝试使用以下正则表达式捕获在打开和关闭li标签之间可能发生的所有事情:

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

I have created the regex here on regex 101.

我不明白为什么它没有抓住单个li元素而不是第一个li和最后一个li之间的所有文本。我对正则表达式的结构不是很熟悉,所以我不确定我需要研究什么以捕获可能显示并仍然终止</li>标记上的各个匹配项的所有属性,特殊字符等。

更新: New Regex101 demo that better reflects the examples I'm trying to capture(即使我原来的正则表达式也无法通过其中的某些测试)

3 个答案:

答案 0 :(得分:1)

只需将+更改为+?,以使其变得“懒惰”,以匹配尽可能少的字符

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

演示:https://regex101.com/r/OTcwF6/3

此外,您可能希望将这些内容放在<li([...]+?)<\/li>组的html标记之间,以便使这些内容与标记本身分开。我不知道您的用例是什么,但这似乎是您需要的。


编辑,确定了。 .可以匹配任何字符,因此.*?的意思是“尽可能少匹配任何字符,或者完全不匹配”。这更简单了,似乎可以满足复杂示例所需的一切

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

演示:https://regex101.com/r/OTcwF6/8

答案 1 :(得分:1)

我会使用:

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

位置:

  • [^>]*表示不是>的任何字符

Demo

答案 2 :(得分:0)

根据评论进行修改:

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

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