regex 在JavaScript中使用正则表达式验证货币金额[重复]

csga3l58  于 2023-05-08  发布在  Java
关注(0)|答案(3)|浏览(130)

此问题已在此处有答案

11年前关闭。

可能重复:

What's a C# regular expression that'll validate currency, float or integer?
如何在JavaScript中使用正则表达式验证货币金额?

  • 小数分隔符:* ,
  • 十、百等分隔符:* .
  • 图案:* ###.###.###,##

有效金额示例:

1
1234
123456

1.234
123.456
1.234.567

1,23
12345,67
1234567,89

1.234,56
123.456,78
1.234.567,89

编辑

我忘了说下面的模式也是有效的:###,###,###.##

js5cn81o

js5cn81o1#

仅根据你给出的标准,这就是我的想法。
/(?:^\d{1,3}(?:\.?\d{3})*(?:,\d{2})?$)|(?:^\d{1,3}(?:,?\d{3})*(?:\.\d{2})?$)/
Demo
这是丑陋的,它只会变得更糟,因为你发现更多的情况下,需要匹配。您最好找到并使用一些验证库,而不是尝试自己完成所有这些工作,尤其是在单个正则表达式中。

  • 已更新以反映新增要求。*
  • 根据以下评论再次更新。*

它将匹配123.123,123(三个尾随数字而不是两个),因为它将接受逗号或句点作为千位和小数点分隔符。为了解决这个问题,我现在基本上把表达式加倍了;它要么用逗号作为分隔符,用句点作为小数点来匹配整个内容,要么用句点作为分隔符,用逗号作为小数点来匹配整个内容。
明白我的意思了吧?(^_^)
下面是详细的解释:

(?:^           # beginning of string
  \d{1,3}      # one, two, or three digits
  (?:
    \.?        # optional separating period
    \d{3}      # followed by exactly three digits
  )*           # repeat this subpattern (.###) any number of times (including none at all)
  (?:,\d{2})?  # optionally followed by a decimal comma and exactly two digits
$)             # End of string.
|              # ...or...
(?:^           # beginning of string
  \d{1,3}      # one, two, or three digits
  (?:
    ,?         # optional separating comma
    \d{3}      # followed by exactly three digits
  )*           # repeat this subpattern (,###) any number of times (including none at all)
  (?:\.\d{2})? # optionally followed by a decimal perioda and exactly two digits
$)             # End of string.

有一件事让它看起来更复杂,那就是里面所有的?:。通常,正则表达式也会捕获(返回匹配)所有的子模式。?:所做的就是不去捕获子模式。所以从技术上讲,如果你把所有的?:都取出来,完整的东西仍然会匹配整个字符串,这看起来更清晰一些:
/(^\d{1,3}(\.?\d{3})*(,\d{2})?$)|(^\d{1,3}(,?\d{3})*(\.\d{2})?$)/
regular-expressions.info也是一个很好的资源。

iovurdzv

iovurdzv2#

这适用于您的所有示例:

/^(?:\d+(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{3})*(?:,\d{2})?)$/

作为一个冗长的正则表达式(但在JavaScript中不支持):

^              # Start of string
(?:            # Match either...
 \d+           # one or more digits
 (?:,\d{3})*   # optionally followed by comma-separated threes of digits
 (?:\.\d{2})?  # optionally followed by a decimal point and exactly two digits
|              # ...or...
 \d+           # one or more digits
 (?:\.\d{3})*  # optionally followed by point-separated threes of digits
 (?:,\d{2})?   # optionally followed by a decimal comma and exactly two digits
)              # End of alternation
$              # End of string.
sycxhyv7

sycxhyv73#

这将处理上面的所有内容,除了(刚刚添加的)。)123.45箱:

function foo (s) { return s.match(/^\d{1,3}(?:\.?\d{3})*(?:,\d\d)?$/) }

您需要处理多种分隔符格式吗?

相关问题