这就是我一直在使用的
\$?[0-9]+\.*[0-9]*
但是当我做一些测试时,我发现了像
这样的事情$$$34.00
将作为匹配返回(但matcher.group()
)只返回匹配的子字符串。如果用户输入一个以上的美元符号,我不希望它甚至传递正则表达式,所以我尝试了这个:
\${1}[0-9]+\.*[0-9]*
但这似乎与我第一次输入的正则表达式相同。现在我正在java中测试它,但是,我打算使用Boost库在c ++中使用它。但请不要在这里给我解决方案,因为我试图在没有人给我答案的情况下学习。
但我确实需要帮助,因此用户只能输入一个美元符号(这是我认为\${1}
会做的)
答案 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
(\.\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中使用一些库。