我有一个字符串,其中包含格式化的货币值,例如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
有人可以帮我解决这个问题吗?
答案 0 :(得分:11)
你需要一个正则表达式“看后面”(?<=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
答案 1 :(得分: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}
会是一个更好的正则表达式,因为它会正确匹配:
并且它不会错误匹配:
答案 2 :(得分:0)
在上述所有解决方案中,请注意字符串中的所有值都是带逗号的十进制值。如果货币值字符串看起来像这样:
String str =“ 1,123.67aed,34,234.000usd,1234euro”;
不是所有的值都是小数。应该有一种方法可以确定货币是十进制还是整数。