【问题标题】:Remove trailing decimal point & zeroes with Regex使用正则表达式删除尾随小数点和零
【发布时间】:2011-09-21 00:17:24
【问题描述】:

这是从字符串中删除尾随小数和零的正确正则表达式吗?我无法让它工作。我错过了什么?

  1. 78.000 -> 78
  2. 78.008 -> 78.008

str.replaceAll("^.0*$", "");

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    您需要转义.,因为它是正则表达式中匹配任何字符的特殊字符。您还必须删除固定在数字开头的^

    str.replaceAll("\\.0*$", "");
    

    如果您想确保点前面有一个数字,您可以使用lookbehind,如下所示:

    str.replaceAll("(?<=^\\d+)\\.0*$", "");
    

    lookbehind((?&lt;=...) 部分)不是匹配的一部分,因此不会被替换,但它仍然必须匹配,才能匹配正则表达式的其余部分。

    【讨论】:

    • 我不是反对者,但您的后视无法工作 - Java 要求后视具有最大长度,因此您不能在其中使用 +*。此外,您可能应该改进最后一句话的措辞 - 后视 can 是匹配的一部分,它只是匹配一个位置而不是一个字符(在这种情况下,该位置在匹配之前)。可以使用str.replaceAll("(?&lt;=whatever)","stuff") 之类的方法在匹配后附加文本。
    • @PeterBoughton,它似乎工作正常here。你确定后面的部分吗?
    • 嗯。我确定 - 我总是忘记并遇到这个问题,不得不改用{0,99}{1,99}。现在我很困惑。 ://
    • @PeterBoughton,我查了一下:stackoverflow.com/questions/1536915/…。显然,lookbehind 中的匹配必须比Integer.MAX_VALUE 短。此外,+ 实现为 {1,0x7FFFFFFF}。因此,由于后视中只有一个字符 (\d),因此它可以工作。但如果我再添加一个,比如here,它就会失败。
    • 好吧,好吧,我不会发疯,但我也不知道发生了什么事......做\d* 工作。做\d+ 工作。执行\d\d* 会引发错误“后视组在索引 8 附近没有明显的最大长度”ideone.com/6mRfk
    【解决方案2】:

    不。使用这个:

    str.replaceAll("[.0]+$", "");
    

    【讨论】:

    • 这不太对,因为它会导致类似2.000.000 的东西被转换成2
    • @NullUserException ఠ_ఠ - 这不是 OP 想要的吗?
    • 也许吧。我解释它的方式,这应该转换为2.000
    • 需要转换成2。谢谢!
    • @FelixYan - 是的。我们不是在这里建造宇宙飞船。我们正在解决 OP 的问题,该问题总是处理“十进制”字符串。
    【解决方案3】:

    去掉匹配字符串开头的^。您还需要转义 .,因为它是匹配任何字符(换行符除外)的正则表达式元字符:

    str.replaceAll("\\.0*$", "");
    

    演示:http://ideone.com/RSJrO

    【讨论】:

    • @Daniel str.replaceAll("\\.*0*$", "") 适用于“78.0000”、“78.08”和“78.80000”。
    • @RohanKandwal 不确定您是否注意到,但此答案在0 之后只有一个*,您之前也有一个。
    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多