【问题标题】:Java string.match / string.replace does not match regex correctlyJava string.match / string.replace 没有正确匹配正则表达式
【发布时间】:2014-01-15 05:49:55
【问题描述】:

我有一个字符串"123.0" 并使用"123.0".matches( "(\\.)?0*$" ) 检查它是否有任何尾随零但不匹配。相同的正则表达式正确匹配字符串@http://regexpal.com/

如果我只想用其他东西替换最后的零呢? String.replace 说:

replace(CharSequence 目标,CharSequence 替换) - 用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。

但是"123.0".replace( "(\\.)?0*$", "" )它不会替换最后一个“.0”。

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    java.lang.String.matches 方法匹配整个字符串,而不是它的一部分。 (无需指定^$)。

    所以你的模式字符串应该是:

    "\\d+\\.?0*"
    

    Demo

    更新根据问题编辑:

    您应该使用replaceAll 而不是replacereplace 不接受正则表达式。它按字面意思解释第一个参数。

    "123.0".replaceAll("\\.0*$", "")
    

    【讨论】:

    • String.replace 怎么样?
    【解决方案2】:

    与大多数其他语言不同,java 的匹配需要 整个 字符串才能匹配,因此您必须在正则表达式中添加前导 .*

    if (str.matches(".*\\.0+"))
    

    请注意,您的正则表达式似乎有点错误 - 一切都是可选的,因此它可以匹配任何内容。试试这个正则表达式。

    另外,因为它必须匹配整个字符串,所以 ^ 和 $ 是隐含的(如果你愿意,可以对它们进行编码 - 没有区别)

    【讨论】:

    • 这甚至会匹配a.0
    • String.replace 怎么样。我已经更新了问题并进行了澄清。
    • @thefourtheye 是的,就像 OP 的正则表达式一样。如果问题中的代码(他没有验证输入,只是测试它是否以零结尾),则此正则表达式最接近意图
    • @markovuksanovic 这是一个完全不同的问题。最好提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多