Regex 这个正则表达式匹配(#x20AC;,$和£;价格?
我对regex很陌生。我正在尝试建立一个正则表达式,我可以使用它来查找和提取符合某些有效格式的网站的价格 让我举几个例子:Regex 这个正则表达式匹配(#x20AC;,$和£;价格?,regex,Regex,我对regex很陌生。我正在尝试建立一个正则表达式,我可以使用它来查找和提取符合某些有效格式的网站的价格 让我举几个例子: € 14,99 -> 14,99 €14,99 -> 14,99 €1.337,80 -> 1.337,80 £ 4.99 -> 4.99 £4.99 -> 4.99 £4,711.99 -> 4,711.99 $ 8.88 -> 8.88 $14.99
€ 14,99 -> 14,99
€14,99 -> 14,99
€1.337,80 -> 1.337,80
£ 4.99 -> 4.99
£4.99 -> 4.99
£4,711.99 -> 4,711.99
$ 8.88 -> 8.88
$14.99 -> 14.99
$4,000,711.99 -> 4,000,711.99
我想出了一个迄今为止效果很好的正则表达式:
/(((?<=([$£] ?))((\d{1,3}(,\d{3})+)|\d+).)|((?<=(€ ?))((\d{1,3}(.\d{3})+)|\d+),))\d{2}(?!\d)/g
这些价格不应与正则表达式匹配;然而,他们确实如此;我也不知道为什么:-)这个(已经浓缩的)部分似乎有问题
/(?您得到的是误报(而不是否定),因为未转义的
匹配任何字符。要仅匹配小数点,请使用\。
根据我的原始评论,您遇到的问题是由于
是一个特殊字符。在regex中,它匹配任何字符(除非另有规定,否则\n
除外-即在许多正则表达式引擎中使用s
/单行模式标志)
另外,请注意lookbehinds目前在JavaScript中不起作用,尽管支持即将到来!目前,只有Chrome 62+支持此令牌。您最好使用捕获组
我认为您正在寻找以下正则表达式模式
类似地,如果正则表达式模式也允许使用不带数千分隔符的数字,则可以使用以下命令
(?:€ ?((?:\d{1,3}(?:\.\d{3})*|\d+),\d{2})|[£$] ?((?:\d{1,3}(?:,\d{3})*|\d+)\.\d{2}))(?!\d)
展开并运行下面的代码段以查看它的使用情况
(函数(){
控制台日志(“hallo”);
让priceTags=document.queryselectoral(“.p13n sc price”);
var re=/(?:€?(\d{1,3}(?:\.\d{3})*,\d{2})[英镑]?(\d{1,3}(?:,\d{3})*\.\d{2}))(?!\d)/g,
计数=0;
priceTags.forEach((e)=>{
让输入=e.textContent,
匹配;
while((match=re.exec(input))!=null){
计数++;
log(计数“->”,匹配[1]| |匹配[2]);
}
});
})();
正匹配
12,18欧元
$14.18
12.18英镑
12.99英镑
4.75英镑
4.75英镑
4,75欧元
4,75欧元
$4.75
$4.75
14,75欧元
1004.75美元
1004.75英镑
1.004,75欧元
1004.75美元
1004.75英镑
1.004,75欧元
$1000004.75
1000004.75英镑
1.000.004,75欧元
$7.99-$12.18
7.99英镑-12.18英镑
4,59欧元-17,34欧元
$9.98-$14.98
7.99英镑-12.18英镑
4,59欧元-17,34欧元
负匹配
1004.75欧元
$1.004,75
1.004,75英镑
4.75欧元
4.75欧元
$9,98
$9,98
19,98英镑
19,98英镑
$9,98-$14,98
7,99英镑-12,18英镑
4.59欧元-17.34欧元
$9,98-$14,98
7,99英镑-12,18英镑
4.59欧元-17.34欧元
避开
,使其成为\。
这里的匹配/非匹配规则到底是什么?我有点困惑。仅供参考:为了可读性,许多regexp语言都有类似/x
的修饰符,允许您插入注释和额外的空格。不幸的是,Javascript没有,尽管可以使用w说唱歌手,例如。不知道我为什么被否决。如果否决者仍然存在,你愿意评论为什么吗?不是我:-)我被否决了,所以这至少回到了0!非常感谢你的详细解释!!!
/(?<=([$£] ?))\d+.\d{2}(?!\d)/g
(?:€ ?(\d{1,3}(?:\.\d{3})*,\d{2})|[£$] ?(\d{1,3}(?:,\d{3})*\.\d{2}))(?!\d)
(?:€ ?((?:\d{1,3}(?:\.\d{3})*|\d+),\d{2})|[£$] ?((?:\d{1,3}(?:,\d{3})*|\d+)\.\d{2}))(?!\d)