如何使用正则表达式从重复结果输出一个结果?

时间:2013-06-11 13:48:03

标签: regex

你能为我提供一个正则表达式来输出重复价格的结果吗?对于html标签内的任何内容而言,这可能是通用的意义,而不仅仅是价格。

即。这是刮价的规则:

<strong class="bigprice">(.+?)</strong>

规则输出:“£4.99”“£4.99”(因为你可以看到结果是重复的,因为在源代码中有两个相同的标签后跟结果。)

我只希望显示第一个结果,而不是两个,是否仍然在正则表达式中执行此操作?

1 个答案:

答案 0 :(得分:1)

描述

给定一个以空格分隔的值列表,例如£1.00 £2.00 £2.00 £1.00 £1.00,您可以通过使用负向查找来查找是否存在重复项,以查找返回引用的值。我还在字符类中添加了$和符号,以允许多种货币类型。这将返回每个值的最后一个实例,这实际上使输出唯一。

正则表达式:(?:\s|^)((?:£|$|\xC2|\xA3)\d+\.\d{1,2})(?=\s|$)(?!.*?\s\1(?=\s|$))

enter image description here

输入:£1.00 £2.00 £2.00 £1.00 £1.00 link to example

$matches Array:
(
    [0] => Array
        (
            [0] =>  £2.00
            [1] =>  £1.00
        )

    [1] => Array
        (
            [0] => £2.00
            [1] => £1.00
        )

)

因此,我们可以将此想法更进一步,以包含您的测试表达式<strong class="bigprice">(.+?)</strong>,以防止重复值(.+?)。由于这看起来像html,我将替换.+?,其匹配所有字符[^<]*,这将匹配所有字符,直到下一个开放角括号

正则表达式:(?:<strong\s(?=[^>]*class="bigprice")[^>]*>)\s*((?:£|$|\xC2|\xA3)\d+\.\d{1,2})\s*<\/strong>(?!.*?(?:<strong\s(?=[^>]*class="bigprice")[^>]*>)\s*\1\s*<\/strong>)

enter image description here

输入:<strong class="bigprice">£1.00</strong><strong class="bigprice">£2.00</strong><strong class="bigprice">£1.00</strong> link to example

$matches Array:
(
    [0] => Array
        (
            [0] => <strong class="bigprice">£2.00</strong>
            [1] => <strong class="bigprice">£1.00</strong>
        )

    [1] => Array
        (
            [0] => £2.00
            [1] => £1.00
        )

)

摘要

在这两种情况下,如果在输入文本中找到重复值,则表达式将失败。