正则表达式匹配美元金额

5

有没有人能为我提供以下模式的正则表达式?

$1234

$31234.3

$1234.56

$123456.78

$.99

我的要求是小数点前的数字不应超过6位,小数点后的数字不应超过2位。请帮帮我。谢谢。


我认为有正则表达式的快捷方式/别名来表示十进制数字,因此所有包含[0-9]的建议都可以用它们来替换。 - Merlyn Morgan-Graham
2
这是确实存在的,绝对值得注意。如果长格式与快捷方式相差不大,我总是更喜欢使用更明确的格式。对于像空格这样的东西,完整书写会很烦人,对于字母数字类型的内容,我发现这意味着它们更易于一眼阅读,特别是对于不太熟悉正则表达式(因此字符类快捷方式)的人。 - Chris
不要出现负数金额,例如退款? - Clint Pachl
4个回答

9
^\$(?=.*\d)\d{0,6}(\.\d{1,2})?$

(?=.*\d) 确保字符串中至少有一个数字。如果没有这个条件,正则表达式 ^\$\d{0,6}(\.\d{1,2})?$ 将会匹配字符串 $

顺便提一下,预查的长度不需要这么长;即使是简单的 (?=.),因为正则表达式确保了随后的字符是有效的。因此,它可以简化为

^\$(?=.)\d{0,6}(\.\d{1,2})?$

1
在第一个小数匹配中,使用(?=.*/d)相比于/d{1,6}有什么好处?我感觉自己错过了什么。 - Lazarus
1
@Lazarus \d{1,6} 要求小数点前至少有一个数字,它将不匹配 $.99 - Amarghosh

3
^\$[0-9]{0,6}(\.[0-9]{1,2})?$

你需要转义那个小数点 - 现在它将匹配任何字符。 - Hans Kesting
好观点。谢谢。真是太神奇了,我做了那么多次,却从未注意到,因为它当然匹配一个点...;-) - Chris
你难道忘记了还有其他需要转义的东西吗?@Hans - Amarghosh
$始终是元字符(除非在字符内部,例如[$])。 $匹配行尾(而不是字符串结尾),即在\n之前,并且可以出现在正则表达式的中间,当正则表达式设置为多行时(使用m标志)。 - Amarghosh
请纠正那个被点赞的回答中明显的错误,这样做不好看,也不利于 Stack Overflow 社区。 - Amarghosh
显示剩余2条评论

1

模式将会是:

^\$\d{0,6}(\.\d{0,2})?$

这个正则表达式并不验证是否有任何数字,所以"$."是一个有效的匹配,并且在原始要求中给出了一个有效的结果。

解释一下:

^ 表示只有在我要查找的字符串前面没有任何东西时才匹配,例如 "USD$123.45" 在此示例中将失败,因为 $(与 \$ 匹配)不是紧接在字符串开头之后。

\$ 匹配美元符号,在这里使用反斜杠(\)进行转义,用于允许匹配保留字符(在正则表达式上下文中具有特殊含义),在本例中 $ 的意思是匹配字符串末尾,即此点之后没有字符。

\d 将匹配任何十进制字符,即 0-9。

{n,m} 将匹配前面元素的 n 到 m 个实例,如果 n 为 0,则表示匹配是可选的。

\. 匹配小数点,它被转义为 . 是正则表达式中的保留字符,表示匹配任何字符。

(...) 将正则表达式中包含的内容作为一组进行匹配,还有其他后果,但我会让你自己去探索。在这种情况下,它纯粹是为了正则表达式中下一个字符的好处而存在。

? 匹配前面元素的 0 或 1 次出现(在本例中,该组查找小数点和最多 2 个小数字符,因此我们期望字符串中没有带有尾随字符的小数点(0 次出现)或带有最多 2 个小数字符的小数点(1 次出现))

$ 匹配字符串的结尾,在此点之后字符串中不能有任何字符。


不匹配 OP 的最后一个示例 - Amarghosh

0
/^\$([0-9]{0-6})|^\$([0-9]{0-6})+\.([0-9]{0-2})$|\$\.([0-9]{0-2})$/

如果你对一个答案进行了“-1”的评价,请评论说明原因,以便可以改进或删除它... - helle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接