您能否提供一个正则表达式来输出重复价格的结果?对于 html 标签中的任何内容,这可能是通用含义,而不仅仅是价格。
即这是刮价格的规则:
<strong class="bigprice">(.+?)</strong>
规则的输出:“£4.99”“£4.99”(您可以看到结果是重复的,因为在源代码中有两个相同的标签后跟结果。)
我只希望显示第一个结果而不是两者,无论如何在正则表达式中这样做?
您能否提供一个正则表达式来输出重复价格的结果?对于 html 标签中的任何内容,这可能是通用含义,而不仅仅是价格。
即这是刮价格的规则:
<strong class="bigprice">(.+?)</strong>
规则的输出:“£4.99”“£4.99”(您可以看到结果是重复的,因为在源代码中有两个相同的标签后跟结果。)
我只希望显示第一个结果而不是两者,无论如何在正则表达式中这样做?
给定一个以空格分隔的值列表,例如£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
示例链接
$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>
示例链接
$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
)
)
在这两种情况下,如果在输入文本中发现重复值,则表达式将失败。