你能为我提供一个正则表达式来输出重复价格的结果吗?对于html标签内的任何内容而言,这可能是通用的意义,而不仅仅是价格。
即。这是刮价的规则:
<strong class="bigprice">(.+?)</strong>
规则输出:“£4.99”“£4.99”(因为你可以看到结果是重复的,因为在源代码中有两个相同的标签后跟结果。)
我只希望显示第一个结果,而不是两个,是否仍然在正则表达式中执行此操作?
答案 0 :(得分:1)
给定一个以空格分隔的值列表,例如£1.00 £2.00 £2.00 £1.00 £1.00
,您可以通过使用负向查找来查找是否存在重复项,以查找返回引用的值。我还在字符类中添加了$
和符号,以允许多种货币类型。这将返回每个值的最后一个实例,这实际上使输出唯一。
正则表达式:(?:\s|^)((?:£|$|\xC2|\xA3)\d+\.\d{1,2})(?=\s|$)(?!.*?\s\1(?=\s|$))
输入:£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>)
输入:<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
)
)
在这两种情况下,如果在输入文本中找到重复值,则表达式将失败。