Regex 这个正则表达式匹配(#x20AC;,$和£;价格?

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

我对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
$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)