正则表达式查找货币而不以字符串结尾

时间:2019-06-14 06:42:18

标签: regex

我正在尝试使用正则表达式来识别字符串中可能包含或不包含小数位的所有货币数字,并且我不希望匹配在最后一位数字之后具有特定字符串的任何货币。

这里是我当前的正则表达式:/([\$])([0-9,]*[0-9][\.][0-9][0-9])(?!\<sup)/gi

我尝试添加?符号以使小数可选,但这会破坏负向查找

我已经尝试过:/([\$])([0-9,]*[0-9][\.]?[0-9]?[0-9]?)(?!\<sup)/gi

使用以下字符串在https://regexr.com/上测试此表达式:

$712.95 shipping, $14.95 FREE on orders $99.95 over $100 International shipping from $9.95, FREE on orders over $120 - test: $678.45<sup 

$100$120的值都不匹配。


这些应该匹配:

$712.95
$14.95
$99.95
$100
$9.95
$120

不应匹配:

$678.45<sup

1 个答案:

答案 0 :(得分:0)

否定的超前预测将断定右边的不是<sup,它可以回溯直到匹配为止。

一种选择是使用负前瞻,并将其放在美元符号之后,以断言美元符号中不包含数字格式后跟<sup的部分:

\$(?!\d{1,3}(?:,\d{3})*(?:\.\d+)?<sup)\d+(?:,\d{3})*(?:\.\d+)?

Regex demo

如果您只想匹配两位数,则可以使用\d{2}代替\d+