Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配美元金额的Java正则表达式_Java_Regex - Fatal编程技术网

匹配美元金额的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]*