【问题标题】:regex to strip leading zeros treated as string正则表达式去除被视为字符串的前导零
【发布时间】:2015-04-15 19:03:20
【问题描述】:

我有这样的数字需要删除前导零。

这是我需要的:

00000004334300343 -> 4334300343

0003030435243 -> 3030435243

我无法弄清楚这一点,因为我是正则表达式的新手。这不起作用:

(^0)

【问题讨论】:

    标签: java regex


    【解决方案1】:

    你快到了。你只需要量词:

    str = str.replaceAll("^0+", "");
    

    它在字符串的开头(由插入符号给出 - ^),带有空字符串。

    【讨论】:

    • @HorseVoice 可能发布共享链接?
    • @HorseVoice 但在 Java 中工作:ideone.com/TblPQ7 这不是您想要的吗?
    • @RohitJain 你能解释一下你的答案,这样我就可以学习并投票给你吗?
    • @KickButtowski 你在说哪个角色,需要转义? ^0 只会匹配 1 个0,不会超过这个。
    • @RohitJain 你在回答中提到空字符串是什么意思?为什么不在你的正则表达式中使用转义字符?
    【解决方案2】:

    如果您需要从“00”获取“0”,则已接受的解决方案将失败。这是正确的:

    str = str.replaceAll("^0+(?!$)", "");
    

    ^0+(?!$) 表示如果后面没有字符串结尾,则匹配一个或多个零。

    感谢评论者 - 我已更新公式以匹配作者的描述。

    【讨论】:

    • 这个方法失败,像000001230000这样的数字它给出了输出1230
    • 答案已更新以反映正确的正则表达式。 replaceAll 公式中缺少“^”符号,但作者在公式的描述/解释中有它。我认为这是一个错过/错字。感谢 Mohsen 指出这一点。
    • 当使用强模式时,你可能想使用这个:str = str.replaceAll(RegExp("^0+(?!$)"), "");
    【解决方案3】:

    如果您知道输入字符串都包含数字,那么您可以这样做:

    String s = "00000004334300343";
    System.out.println(Long.valueOf(s));
    // 4334300343
    

    Code Demo

    通过转换为Long,它将自动去除所有前导零。

    【讨论】:

    • 所以。它忽略了零?
    • 是的,请查看链接的演示。
    • 对于其他答案,我们不需要转义字符\\吗?
    • 正则表达式中没有特殊字符可以转义
    【解决方案4】:

    另一种解决方案(阅读起来可能更直观)

    str = str.replaceFirst("^0+", "");
    

    ^ - 匹配行首
    0+ - 匹配零位字符一次或多次

    你可以在这里找到一个详尽的模式列表Pattern

    【讨论】:

    • 你能解释一下你的答案吗?
    【解决方案5】:

    \b0+\B 将完成这项工作。请参阅demo\b 将您的匹配锚定到单词边界,它匹配一个或多个零的序列0+,并且不在单词边界中结束(如果您只有 @,则不会消除最后一个 0 987654326@)

    【讨论】:

      【解决方案6】:

      去除前导零的正确正则表达式是

      str = str.replaceAll("^0+", "");
      

      此正则表达式将匹配字符串开头的 one and more 数量的 0 字符。 没有理由担心 replaceAll 方法,因为正则表达式具有 ^(开始输入)特殊字符,可确保仅调用一次替换。

      最终您可以使用 Java 内置功能来做同样的事情:

      String str = "00000004334300343";
      long number = Long.parseLong(str);
      // outputs 4334300343
      

      前导零会自动为您去除。

      【讨论】:

        【解决方案7】:

        我知道这是一个老问题,但我认为最好的方法实际上是

        str = str.replaceAll("(^0+)?(\d+)", "$2")
        

        我建议这样做的原因是因为它将字符串分成两组。第二组是至少一位数字。第一组匹配行首的 1 个或多个零。但是,第一组是可选的,这意味着如果没有前导零,您只需获取所有数字。而且,如果str是一个零,那么您将得到一个零(因为第二组必须至少匹配一个数字)。

        因此,如果它是任意数量的 0,您将得到正好一个零。如果它以任意数量的 0 开头,后跟任何其他数字,则不会出现前导零。如果它以任何其他数字开头,您将完全恢复到最初的状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多