匹配美元金额的Java正则表达式
这就是我一直在用的匹配美元金额的Java正则表达式,java,regex,Java,Regex,这就是我一直在用的 \$?[0-9]+\.*[0-9]* 但当我做一些测试时,我注意到 $$$34.00 将作为匹配返回(但matcher.group())只返回匹配的子字符串。如果用户输入超过一个美元符号,我甚至不希望它传递正则表达式,因此我尝试了以下方法: \${1}[0-9]+\.*[0-9]* 但这似乎与我第一次键入的正则表达式的行为相同。现在我在java中测试这个,但是我打算在C++中使用它来使用Boost库。但是请不要在这里给我这个解决方案,因为我正在努力学习,没有人给我答案
\$?[0-9]+\.*[0-9]*
但当我做一些测试时,我注意到
$$$34.00
将作为匹配返回(但matcher.group()
)只返回匹配的子字符串。如果用户输入超过一个美元符号,我甚至不希望它传递正则表达式,因此我尝试了以下方法:
\${1}[0-9]+\.*[0-9]*
但这似乎与我第一次键入的正则表达式的行为相同。现在我在java中测试这个,但是我打算在C++中使用它来使用Boost库。但是请不要在这里给我这个解决方案,因为我正在努力学习,没有人给我答案
但是我确实需要帮助,这样用户只能输入一个美元符号(这是我认为
\${1}
应该做的)您缺少^
(字符串开头),$
(字符串结尾)
您可以在开始时执行类似于
[^\$]*\$?
的操作。这将确保没有重复的$符号,但如果没有$存在,也会匹配
此外,如果您使用的是货币(可能是十进制,后面两位数字),则应使用[\.\d{2}]?。
也就是说,如果它后面跟一个句点和两个数字,或者什么都没有,那么它可以是匹配的。正如注释中所述,它还可以匹配一行中的多个句点,因此您不应该在
\.
之后使用*
量词。我建议避免使用正则表达式进行货币解析,尤其是当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-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)?$
,字符串末尾有一个句点和两位数字(可选)
匹配项:
$4,098.09
$4098.09
$0.35
$0
$380
不匹配:
$098.09
$0.9
$10,98.09
$10,980456
我知道这很晚了,但这似乎对我有用
(\$)?[0-9]+\.*[0-9]*
我不明白为什么它对你不起作用。[$]([1-9]+\.?\d*)|([0]\.\d*)|[0])
模式非常适合这种情况
这是标准的Perl正则表达式,但可以在JAVA中与一些lib一起使用。它不允许在一行中使用一组句点吗?您可以指定字符串的开始和结束,例如^\${1}[0-9]+\.[0-9]*$是整个字符串的数量吗?另外,您目前如何匹配它?使用
.find()
?是的,我使用的是matcher.find()
@Eric.K.Yung看起来像^\$?[0-9]+\.[0-9]*$做了我想要的。我希望用户能够输入带有美元符号的美元金额,或者不带美元符号。如果用户不需要,我不想强迫用户添加美分。\.{0,1}
是否适用于此?\.?
与\.{0,1}
相同。?
量词表示它发生一次或根本不发生。正如我在回答中所显示的那样,您还应该在句点后包含两个可能的分位数。如果没有它们,$27.50
将只能与$27相配。
很遗憾我不能再+1次这是非常整洁的,我肯定会将它存储在我的工具箱中,但是,我正在尝试学习正则表达式,这就是为什么我试图找到这个问题的解决方案。是的,当然,这是你的特权。但是,为了让您知道货币字符串也可以包含逗号,例如,$23456.78
@rage:检查此答案,了解有关使用正则表达式解析美国货币字符串的一些提示:.parse(str)
方法接受不正确的字符串,如$12asdf
([1-9]\d*)?\d)如果用户没有输入逗号,也要小心,不是吗?我很高兴你发布了这个答案,因为我真的从分解正则表达式和逐段理解它中学到了很多。是的,当字符串中没有使用逗号时,这部分是专门用来捕获的。单独获取$amount有什么相反呢
(\$)?[0-9]+\.*[0-9]*