2012-09-13 81 views
5
值的字符串分割

我有我想提取和处理所有的货币值其中包含了格式的货币值一样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 

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

+1

你是说你想让'.00'回来?输入值应该使用更好的分隔符,而不是使用逗号,这很令人困惑。 – Raptor

+0

是..我想在输出中返回小数,我没有控制输入字符串,它是从外部应用程序喂食。 –

+0

如果它不是家庭作业,它可能更有意义,所以使用'String.split'作为逗号,'SimpleDecimalFormat'解析这些值。有了这个,你可以控制它是一个数字,小数点分隔符格式,然后按照你想要的方式格式化该十进制值。 – helios

回答

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 
+0

太棒了!它的工作原理,错过了“看后面”。稍后会接受答案。谢谢!! –

3

您也可以使用不同的正则表达式来匹配您正在搜索的模式(然后它不会“T真正重要的分隔符是什么):

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
+0

只是想发布相同的答案,但使用不同的正则表达式,即“\\ d {1,3}(,\\ d {3})* \\。\\ d {2}”'。您的匹配值将无法匹配“d,ddd,ddd.dd”等值,但会匹配“dd,dd.dd” –