正则表达式匹配美元金额

Posted

技术标签:

【中文标题】正则表达式匹配美元金额【英文标题】:Regular expression to match dollar amounts 【发布时间】:2011-03-12 17:26:03 【问题描述】:

谁能提供以下模式的正则表达式?

1234 美元

$31234.3

1234.56 美元

$123456.78

$.99

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

【问题讨论】:

我认为有十进制数字的正则表达式快捷方式/别名,所以所有这些包含 [0-9] 的建议都可能被替换为那些。 这是真的,绝对值得一提。如果长格式不超过快捷方式,我总是喜欢使用更明确的。对于像空格这样的东西,完整地写出来很烦人,对于字母数字类型的东西,我发现这意味着它们对于不习惯正则表达式的人来说更易读(因此是字符类快捷方式)。 没有负美元金额,例如退款? 【参考方案1】:
^\$(?=.*\d)\d0,6(\.\d1,2)?$

(?=.*\d) 确保字符串中至少有一位数字。没有它,正则表达式 ^\$\d0,6(\.\d1,2)?$ 将匹配字符串 $

顺便说一句,前瞻不必这么长;即使是简单的(?=.) 也可以,因为正则表达式确保后续字符确实有效。因此,可以简化为

^\$(?=.)\d0,6(\.\d1,2)?$

【讨论】:

在第一个十进制匹配中使用 (?=.*/d) 而不是 /d1,6 有什么好处?我觉得我在这里遗漏了一些东西。 @Lazarus \d1,6 要求小数点前至少有一位数字 - 它与 $.99 不匹配【参考方案2】:
^\$[0-9]0,6(\.[0-9]1,2)?$

【讨论】:

您需要转义该小数点 - 现在它将匹配任何内容。 好点。谢谢。令人惊讶的是我这样做了多少次,而且我从来没有注意到,因为它当然匹配一个点...... ;-) 你是不是也忘记了逃避别的什么? @汉斯 @Amarghosh:$ 是我不确定的另一件事。我没有测试它,只是假设正则表达式设计者只会将它解释为字符串的结尾,如果它位于模式的末尾。不过我可能是错的。无论如何,必须为原始海报留下一些东西。 ;-) $ 始终是元字符(除非在字符内部,如 [$])。 $ 匹配end of a line(而不是字符串的结尾),即,就在\n 之前,并且当正则表达式设置为多行(使用m 标志)时可以出现在正则表达式的中间。 【参考方案3】:

模式是:

^\$\d0,6(\.\d0,2)?$

这并不能验证是否有任何数字,例如“$”。根据提问者的原始要求,是有效匹配和有效结果。

解释一下:

^ 表示仅在我要查找的字符串之前没有任何内容时才匹配,即“USD$123.45”在此示例中将失败,因为 $(与 \$ 匹配)不是紧跟在开头之后字符串。

\$ 匹配 $ 字符,反斜杠 () 的使用称为转义,用于允许您匹配保留字符(在正则表达式的上下文中表示某些内容)在这种情况下 $ 表示匹配字符串的结尾,即此点之后没有字符

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

n,m 将匹配前一个元素的 n 到 m 个实例,如果 n 为 0,则实际上意味着匹配是可选的。

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

(...) 将包含在其中的正则表达式作为一个组组合在一起,还有其他结果,但我将留给你去探索。在这种情况下,它纯粹是为了正则表达式中的下一个字符的好处

? 将匹配前一个元素的 0 或 1(在这种情况下,该组会查找小数点和最多 2 个小数字符,因此我们希望没有带有尾随字符的小数点(0 次出现)或带有最多 2 个小数字符的小数点(出现 1 次))

$匹配字符串的结尾,该点之后的字符串中不能有字符。

【讨论】:

与 OP 的最后一个示例不匹配【参考方案4】:
/^\$([0-9]0-6)|^\$([0-9]0-6)+\.([0-9]0-2)$|\$\.([0-9]0-2)$/

【讨论】:

以上是关于正则表达式匹配美元金额的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配一美元,前面没有反斜杠

JS 正则表达式^$详解,脱字符^与美元符$同时写表示什么意思?

金钱的Java正则表达式

求一个正则表达式只能输入数字小数点后两位和

正则表达式位置匹配攻略【转】

hive正则表达式