正则表达式重复组

时间:2012-04-28 02:59:44

标签: regex

我有这样的文字:

<span id="3">

HELLO THERE
<span id="5">
Other stuff
<span id="6">
Other Stuff
<span id="7">
Other sutff

我需要在<span...>文字之后只抓取HELLO THERE个元素。因此,在上面的示例中,除了id = 3的跨度之外的所有跨度。

所以我尝试了(<span.+?>)+来抓住所有跨度。接下来,我尝试HELLO THERE.+?(<span.+?>)+,但这只抓取了第一个相关的。所以我的问题是,在这里使用什么是正确的正则表达式?

2 个答案:

答案 0 :(得分:1)

此正则表达式将Hello Hello之后的所有标记捕获到匹配组中:

HELLO THERE(?:(?:.*?)(<span[^>]+>))+
  • HELLO THERE - 匹配开头
    在非捕获组内:
  • (?:.*?) - 可选地匹配任何文字,直到找到
  • (<span[^>]+>) - span标记 - 将捕获此标记
  • + - 重复前两个步骤,直到找不到其他span标记

您还需要将匹配选项设置为点匹配新行。

答案 1 :(得分:0)

RegEx 1

在这里,我们可以使用几个表达式来获得所需的<span>开头标签。例如,我们可以简单地使用:

\s(<.+)

,左边有一个空格边界,一个捕获组可以做到这一点。

enter image description here

Demo


RegEx 2

另一种更昂贵,更复杂的替代方法是:

([\s\S].*?)(<.+>)

enter image description here

Demo

RegEx 3

然后,我们可以使用以下表达式来降低复杂性并提高性能:

([\s\S].*?)(<.+>)*

enter image description here

Demo

RegEx电路

在这里,我们还可以在jex.im中可视化表达式:

enter image description here