0

最後の 0 のセットを 10 進数で一致させようとしています。例: In9780.56120000 0000が一致します。この正規表現:

(?<=\.\d{0,20})0*$

RegexBuddy では動作するようですが、Java では次のエラーで失敗します。

後読みパターン マッチの最大長は、インデックス 15 付近に制限されている必要があります

誰でもこの問題について洞察を提供できますか?

4

2 に答える 2

9

Javaは「無制限」であると解釈{0,20}していますが、これはサポートされていません。

なぜあなたは後ろを見る必要がありますか?代わりに、キャプチャしないグループを使用してください。

(?:\.\d*)0*$

編集:

文字列の10進数から末尾のゼロを削除するには、次の1行を使用します。

input.replaceAll("(\\.(\\d*[1-9])?)0+", "$1");

ここにいくつかのテストコードがあります:

public static void main(String[] args) {
    String input = "trim 9780.56120000 and 512.0000 but not this00, 00 or 1234000";
    String trimmed = input.replaceAll("(\\.(\\d*[1-9])?)0+", "$1");
    System.out.println(trimmed);
}

出力:

trim 9780.5612 and 512. but not this00, 00 or 1234000

再度編集:

末尾のゼロしかない場合に処理して小数点も削除する場合、つまりはに"512.0000"なります"512""123.45000"、小数点は保持されます。つまり"123.45"、次のようにします。

String trimmed = input.replaceAll("(\\.|(\\.(\\d*[1-9])?))0+\\b", "$2");

その他のテストコード:

public static void main(String[] args) {
    String input = "trim 9780.56120000 and 512.0000 but not this00, 00 or 1234000";
    String trimmed = input.replaceAll("(\\.|(\\.(\\d*[1-9])?))0+\\b", "$2");
    System.out.println(trimmed);
}

出力:

trim 9780.5612 and 512 but not this00, 00 or 1234000
于 2012-11-19T04:10:05.967 に答える
0

I ended up not using regular expressions at all and decided to just loop through each character of the decimal starting at the end and working backwards. Here's the implementation I used. Thanks to Bohemian for pushing me in the right direction.

if(num.contains(".")) { // If it's a decimal
    int i = num.length() - 1;
    while(i > 0 && num.charAt(i) == '0') {
        i--;
    }
    num = num.substring(0, i + 1);
}

Code based off the rtrim function found here: http://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html

Edit: And here's something to remove the decimal for this solution.

// Remove the decimal if we don't need it anymore
// Eg: 4.0000 -> 4. -> 4
if(num.substring(num.length() - 1).equals(".")) {
        num = num.substring(0, num.length() - 1);
}
于 2012-11-19T05:32:10.217 に答える