6

我有一个字符串,其中包含格式化的货币值45,890.00,如45,890.00,12,345.00,23,765.34,56,908.50..

我想提取和处理所有货币值,但无法找出正确的正则表达式,这就是我尝试过的

public static void main(String[] args) {
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50";
    String regEx = "\\.[0-9]{2}[,]";
    String[] results = currencyValues.split(regEx);
    //System.out.println(Arrays.toString(results));
    for(String res : results) {
        System.out.println(res);
    }
}

这个的输出是:

45,890 //removing the decimals as the reg ex is exclusive
12,345
23,765
56,908.50

有人可以帮我解决这个问题吗?

4

3 回答 3

11

你需要一个正则表达式 "look behind" (?<=regex),它匹配,但确实消耗:

String regEx = "(?<=\\.[0-9]{2}),";

这是您的测试用例现在工作:

public static void main(String[] args) {
    String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50";
    String regEx = "(?<=\\.[0-9]{2}),"; // Using the regex with the look-behind
    String[] results = currencyValues.split(regEx);
    for (String res : results) {
        System.out.println(res);
    }
}

输出:

45,890.00
12,345.00
23,765.34
56,908.50
于 2012-09-13T07:43:58.900 回答
4

您还可以使用不同的正则表达式来匹配您正在搜索的模式(那么分隔符是什么并不重要):

 String currencyValues = "45,890.00,12,345.00,23,765.34,56,908.50,55.00,345,432.00";
 Pattern pattern = Pattern.compile("(\\d{1,3},)?\\d{1,3}\\.\\d{2}");
 Matcher m = pattern.matcher(currencyValues);
 while (m.find()) {
    System.out.println(m.group());
 }

印刷

45,890.00
12,345.00
23,765.34
56,908.50
55.00
345,432.00

正则表达式的解释:

  • \\d匹配一个数字
  • \\d{1,3}匹配 1-3 位数字
  • (\\d{1,3},)?可选地匹配 1-3 位数字,后跟逗号。
  • \\.匹配一个点
  • \\d{2}匹配 2 位数字。

但是,我还要说,用逗号作为分隔符可能不是最好的设计,并且可能会导致混淆。

编辑:

正如@tobias_k 指出的那样:\\d{1,3}(,\\d{3})*\\.\\d{2}将是一个更好的正则表达式,因为它会正确匹配:

  • 1,000,000,000.00

并且它不会错误地匹配:

  • 1,00.00
于 2012-09-13T07:50:21.847 回答
0

在上述所有解决方案中,如果字符串中的所有值都是带逗号的十进制值,则需要注意。如果货币值字符串如下所示:

字符串 str = "1,123.67aed,34,234.000usd,1234euro";

这里并不是所有的值都是小数。应该有一种方法来确定货币是十进制还是整数。

于 2019-09-24T11:17:10.730 回答