【问题标题】:How to match multiple occurrences of a substring如何匹配多次出现的子字符串
【发布时间】:2011-10-25 20:37:59
【问题描述】:

如果我有一个 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&lt;span class="abc" /&gt;

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

【问题讨论】:

    标签: regex


    【解决方案1】:

    要匹配多次使用需要使用全局选项

    str.match(/your_expression_here/g)
                                    ^
    

    【讨论】:

    • 这不是在回答他的问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 当您使用它时,将每个\d* 更改为\d+;那一定是个错误。
    【解决方案3】:

    如果您要匹配多次出现的子字符串,则添加 /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+
    

    这将找到您要求的子字符串的两次出现 shown here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2013-05-23
      • 2019-07-14
      • 1970-01-01
      相关资源
      最近更新 更多