2012-09-13 80 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」 –