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

(?<=regex)一致するが消費する正規表現 "look behind" が必要です。

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 に答える