如何匹配子串的多次出现

时间:2011-08-12 14:09:24

标签: regex

如果我有一个HTML字符串,例如:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div>

我想要的文字:

20<span class="abc" /><span class="def">56

如何定义正则表达式以多次匹配目标部分。到目前为止,我有:

str.match(/\d*<[^>]*>\d*/)

但这只会返回第一个数字部分20<span class="abc" />

我需要灵活地匹配多个标签/数字部分,同时修剪前导或尾随字符串中第一个/最后一个数字的任何内容。

3 个答案:

答案 0 :(得分:5)

要多次匹配,请使用全局选项

str.match(/your_expression_here/g)
                                ^

答案 1 :(得分:1)

仅添加/g并称其完成是不够的。一旦知道了勉强的量词,就可以在一个字符串中多次匹配一个子字符串,这很简单-在此处说明问题的解决方案。

给出字符串:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div>

您将使用以下内容找到想要的文字:

\d+.*>\d+

但是给定相同的字符串重复两次:

<div><p>£20<span class="abc" /><span class="def">56</span></p></div><div><p>£20<span class="abc" /><span class="def">56</span></p></div>

您不会多次找到目标选择。由于.*的贪婪性质,您只会找到它一次。要使.*不贪心或不愿意,只需在?之后添加*,您将到达:

\d+.*?>\d+

将以proven here的形式找到您要求的两个子串。

答案 2 :(得分:0)

只允许重复群组:(?:...)+表示“匹配... 1次或更多次:

str.match(/\d+(?:<[^>]*>)+\d+/)

根据Alan Moore的建议,我还将\d*更改为\d+,使得所需的数字不是可选的。