正则表达式匹配美元金额
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)$/
【讨论】:
以上是关于正则表达式匹配美元金额的主要内容,如果未能解决你的问题,请参考以下文章