从字符串格式化的十进制/ Java错误中删除尾随0 - 后视模式匹配必须在索引15附近具有有界最大长度

时间:2012-11-19 03:50:44

标签: java regex regex-lookarounds

我正在尝试以十进制匹配最后一组0。例如:9780.56120000 0000将匹配。这个正则表达式:

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

似乎在RegexBuddy中工作,但Java失败并出现以下错误:

  

后视式模式匹配必须具有接近的有界最大长度   指数15

任何人都可以对此问题提供一些见解吗?

2 个答案:

答案 0 :(得分:9)

Java正在将{0,20}解释为“无限制”,但它不支持。

为什么你需要看看背后?请改为使用非捕获组:

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

编辑:

要从字符串中的十进制数中删除尾随零,请使用以下单行:

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"仍然保留小数点,即{{1} },执行此操作:

"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);
}

答案 1 :(得分:0)

我最终根本没有使用正则表达式,并决定从最后开始循环遍历每个小数字符并向后工作。这是我使用的实现。感谢Bohemian让我朝着正确的方向前进。

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);
}

代码基于此处的rtrim功能:http://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html

编辑:此处有一些内容可以删除此解决方案的小数。

// 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);
}