Java正则表达式匹配美元金额

时间:2013-07-25 16:57:16

标签: java regex

这就是我一直在使用的

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

但是当我做一些测试时,我发现了像

这样的事情
$$$34.00 

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

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

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

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

6 个答案:

答案 0 :(得分:18)

我建议避免使用正则表达式进行货币解析,尤其是当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
}

答案 1 :(得分:12)

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

^\$(([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)一个或多个数字,只有当这是唯一的数字时,第一个数字才能为0

带有句点的{p> (\.\d\d)?$和字符串末尾的2位数字

匹配

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

不匹配:

$098.09
$0.9
$10,98.09
$10,980456

答案 2 :(得分:2)

您可以在开始时执行[^\$]*\$?之类的操作。这样可以确保没有重复的$符号,但如果没有$,则也匹配。

另外,如果您使用的是货币(可能是小数,后面是2位数),则应使用[\.\d{2}]?.

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我知道这会迟到但这似乎对我有用

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

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

答案 5 :(得分:0)

理想情况下,

node.getNext()模式适合这种情况。

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