6

这是我一直在使用的

\$?[0-9]+\.*[0-9]*

但是当我做一些测试时,我注意到像

$$$34.00 

将作为匹配返回(但matcher.group())只返回匹配的子字符串。如果用户输入超过一个美元符号,我什至不希望它通过正则表达式,所以我尝试了这个:

\${1}[0-9]+\.*[0-9]*

但这似乎与我第一次输入的正则表达式的行为相同。现在我正在 java 中测试它,但我计划使用 Boost 库在 c++ 中使用它。但是请不要在这里给我那个解决方案,因为我正在尝试在没有人给我答案的情况下学习。

但我确实需要帮助,所以用户只能输入一个美元符号(这是我认为\${1}会做的)

4

6 回答 6

19

我建议避免使用正则表达式进行货币解析,尤其是当 Java 为您提供了更简单的方法来解决这个问题时。

考虑这段代码:

String str = "$789.11"; // user entered value
Number number = null;
try {
    number = NumberFormat.getCurrencyInstance(Locale.US).parse(str);
} catch(ParseException pe) {
    // ignore
}

if (number != null) {
   // proceed as user entered a good value
}
else {
   // user didn't enter a good value
}
于 2013-07-25T18:30:32.790 回答
14

既然你这样做是为了学习正则表达式......

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

分解:

^\$以 $ 单个美元符号开头的字符串

([1-9]\d{0,2}(,\d{3})*)1-3 位数字,其中第一个数字不是 0,后跟 0 次或多次出现 3 位数字的逗号

或者

(([1-9]\d*)?\d)1个或多个数字,其中第一个数字只有当它是唯一的数字时才能为0

(\.\d\d)?$可选在字符串末尾带有句点和 2 位数字

火柴:

$4,098.09
$4098.09
$0.35
$0
$380

不匹配:

$098.09
$0.9
$10,98.09
$10,980456
于 2013-07-25T19:27:06.617 回答
2

你可以在开始时做一些类似的事情[^\$]*\$?。这将确保没有重复的 $ 符号,但如果没有 $ 存在,也会匹配。

此外,如果您使用的是货币(可能是小数和 2 位数字),您应该使用[\.\d{2}]?.

这表示如果它后跟一个句点和 2 个数字的实例或根本没有,则它可以是匹配的。如评论中所述,它还可以连续匹配多个句点,因此您不应该在*之后使用量词\.

于 2013-07-25T17:54:36.013 回答
1

您缺少^(字符串开头),$(字符串结尾)

^\$\d+([.][0-9]+)?$
于 2013-07-25T17:00:20.270 回答
0

我知道这来晚了,但这似乎对我有用

(\$)?[0-9]+\.*[0-9]*

我不明白为什么它对你不起作用。

于 2015-11-13T07:08:15.643 回答
0

[$](([1-9]+\.?\d*)|([0]\.\d*)|[0])最适合这种情况的模式。

这是标准的 Perl 正则表达式,但可以在带有一些库的 JAVA 中使用。

于 2016-03-12T20:27:39.177 回答