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

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

1234 美元

$31234.3

1234.56 美元

$123456.78

$.99

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

【问题讨论】:

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

标签: c# javascript asp.net regex


【解决方案1】:
^\$(?=.*\d)\d{0,6}(\.\d{1,2})?$

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

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

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

【讨论】:

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

【讨论】:

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

模式是:

^\$\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 的最后一个示例不匹配
【解决方案4】:
/^\$([0-9]{0-6})|^\$([0-9]{0-6})+\.([0-9]{0-2})$|\$\.([0-9]{0-2})$/

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多