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

rag*_*age 5 java regex

这就是我一直在使用的

\$?[0-9]+\.*[0-9]*
Run Code Online (Sandbox Code Playgroud)

但是当我做一些测试时,我发现了类似的东西

$$$34.00 
Run Code Online (Sandbox Code Playgroud)

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

\${1}[0-9]+\.*[0-9]*
Run Code Online (Sandbox Code Playgroud)

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

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

anu*_*ava 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
}
Run Code Online (Sandbox Code Playgroud)

  • 惭愧我不能再这次+1 (2认同)
  • `.parse(str)` 方法接受不正确的字符串,例如 `$12asdf`。 (2认同)

Syo*_*yon 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
Run Code Online (Sandbox Code Playgroud)

不匹配:

$098.09
$0.9
$10,98.09
$10,980456
Run Code Online (Sandbox Code Playgroud)