【问题标题】:How to remove leading zeros from alphanumeric text?如何从字母数字文本中删除前导零?
【发布时间】:2011-02-17 13:09:37
【问题描述】:

我在 SO 中看到了有关如何在此处添加零前缀的问题。但不是相反!

你们能建议我如何删除字母数字文本中的前导零吗?是否有任何内置 API 或者我需要编写一个方法来修剪前导零?

例子:

01234 converts to 1234
0001234a converts to 1234a
001234-a converts to 1234-a
101234 remains as 101234
2509398 remains as 2509398
123z remains as 123z
000002829839 converts to 2829839

【问题讨论】:

    标签: java string alphanumeric


    【解决方案1】:

    正则表达式是完成这项工作的最佳工具;它应该是什么取决于问题规范。以下内容删除了前导零,但在必要时留下了一个(即它不会只是将 "0" 变为空白字符串)。

    s.replaceFirst("^0+(?!$)", "")
    

    ^ 锚点将确保匹配的 0+ 位于输入的开头。 (?!$) 否定前瞻确保不会匹配整个字符串。

    测试工具:

    String[] in = {
        "01234",         // "[1234]"
        "0001234a",      // "[1234a]"
        "101234",        // "[101234]"
        "000002829839",  // "[2829839]"
        "0",             // "[0]"
        "0000000",       // "[0]"
        "0000009",       // "[9]"
        "000000z",       // "[z]"
        "000000.z",      // "[.z]"
    };
    for (String s : in) {
        System.out.println("[" + s.replaceFirst("^0+(?!$)", "") + "]");
    }
    

    另见

    【讨论】:

    • 谢谢。而且您已经无情地进行了测试;)太好了!为测试 +1。
    • @Greg:这个问题是关于 Java,而不是 JavaScript。 Java SE 从 1.4 版开始就有 String.replaceFirst() 方法。
    • 将 trim() 添加到 s.replaceFirst("^0+(?!$)", "") (即 s.trim().replaceFirst("^0+(?!$ )", "") 将有助于删除填充空格!
    • 对于这么简单的任务来说,正则表达式不是有点贵吗?
    • 这在 Kotlin 中不起作用,您需要明确说明 Regex .replaceFirst("^0+(?!$)".toRegex(), "")
    【解决方案2】:

    您可以像这样使用Apache Commons Lang 中的StringUtils 类:

    StringUtils.stripStart(yourString,"0");
    

    【讨论】:

    • 这个单独“0”有问题吗? @汉密尔顿罗德里格斯
    • 如果单独在“0”上使用它,它会返回“”。因此,请注意这是否不是所需的预期效果。
    • 赞成,因为它适用于问题中的用例。在这里也帮了我一个快速的解决方案。谢谢!
    【解决方案3】:

    正则表达式方式怎么样:

    String s = "001234-a";
    s = s.replaceFirst ("^0*", "");
    

    ^ 锚定到字符串的开头(我假设从上下文中您的字符串在这里不是多行的,否则您可能需要查看 \A 的输入开头而不是行开头) . 0* 表示零个或多个 0 字符(您也可以使用0+)。 replaceFirst 只是将所有那些 0 开头的字符替换为空。

    如果像 Vadzim 一样,您对前导零的定义不包括将 "0"(或 "000" 或类似字符串)转换为空字符串(足够合理的预期),如有必要,只需将其放回原处:

    String s = "00000000";
    s = s.replaceFirst ("^0*", "");
    if (s.isEmpty()) s = "0";
    

    【讨论】:

    • 单独“0”有问题。
    【解决方案4】:

    无需任何正则表达式和任何外部库的清晰方法。

    public static String trimLeadingZeros(String source) {
        for (int i = 0; i < source.length(); ++i) {
            char c = source.charAt(i);
            if (c != '0') {
                return source.substring(i);
            }
        }
        return ""; // or return "0";
    }
    

    【讨论】:

    • 虽然你的空间检查不是根据问题,但我认为你的答案会执行得最快。
    • @JohnFowler 10 倍的收获,2 年多后修复
    • 如果循环只找到零,该方法需要在最后返回。返回 ””;或返回“0”;如果你想要至少一个零
    • @slipperyseal 我将其保持打开状态,以便您可以根据需要进行更改,但是由于人们倾向于复制/粘贴,因此始终具有默认行为并不是一个坏主意。感谢您的评论
    【解决方案5】:

    如果您使用的是 Kotlin,这是您唯一需要的代码:

    yourString.trimStart('0')
    

    【讨论】:

      【解决方案6】:

      使用 thelost 的 Apache Commons 答案:使用 guava-libraries(我认为 Google 的通用 Java 实用程序库现在应该位于任何非平凡 Java 项目的类路径中),这将使用 CharMatcher:

      CharMatcher.is('0').trimLeadingFrom(inputString);
      

      【讨论】:

      • +1,任何使用 Guava 的项目的正确答案。 (现在在 2012 年,应该几乎意味着任何 Java 项目。)
      • @Cowan 单独使用“0”是否有问题?将 CharMatcher.is('0').trimLeadingFrom("0");返回“0”还是空字符串?
      • @PhoonOne:我刚刚测试过这个;它返回空字符串。
      【解决方案7】:

      你可以这样做: String s = Integer.valueOf("0001007").toString();

      【讨论】:

      • 不处理字母数字。
      • 如果值对于“00087878787878787878”这样的整数来说太大,它也会失败
      【解决方案8】:

      使用这个:

      String x = "00123".replaceAll("^0*", ""); // -> 123
      

      【讨论】:

        【解决方案9】:

        使用 Apache Commons StringUtils 类:

        StringUtils.strip(String str, String stripChars);
        

        【讨论】:

        • 警告!这将去除前导零和结尾零,这可能不是您想要的。
        • 您可以使用 StringUtils.stripStart() 仅去除前导零。
        【解决方案10】:

        对组使用正则表达式:

        Pattern pattern = Pattern.compile("(0*)(.*)");
        String result = "";
        Matcher matcher = pattern.matcher(content);
        if (matcher.matches())
        {
              // first group contains 0, second group the remaining characters
              // 000abcd - > 000, abcd
              result = matcher.group(2);
        }
        
        return result;
        

        【讨论】:

          【解决方案11】:

          正如一些答案所暗示的那样,使用正则表达式是一种很好的方法。如果您不想使用正则表达式,则可以使用以下代码:

          String s = "00a0a121";
          
          while(s.length()>0 && s.charAt(0)=='0')
          {
             s = s.substring(1); 
          }
          

          【讨论】:

          【解决方案12】:

          我认为这样做很容易。您可以从头开始循环字符串并删除零,直到找到非零字符。

          int lastLeadZeroIndex = 0;
          for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == '0') {
              lastLeadZeroIndex = i;
            } else {
              break;
            }
          }
          
          str = str.subString(lastLeadZeroIndex+1, str.length());
          

          【讨论】:

            【解决方案13】:

            如果您(像我一样)需要从字符串中的每个“单词”中删除所有前导零,您可以将@polygenelubricants 的答案修改为以下内容:

            String s = "003 d0g 00ss 00 0 00";
            s.replaceAll("\\b0+(?!\\b)", "");
            

            导致:

            3 d0g ss 0 0 0
            

            【讨论】:

              【解决方案14】:

              String 上不使用Regexsubstring() 函数将是低效的-

              public static String removeZero(String str){
                      StringBuffer sb = new StringBuffer(str);
                      while (sb.length()>1 && sb.charAt(0) == '0')
                          sb.deleteCharAt(0);
                      return sb.toString();  // return in String
                  }
              

              【讨论】:

                【解决方案15】:

                您可以将"^0*(.*)" 替换为"$1" 与正则表达式

                【讨论】:

                • 我在这里看到的唯一问题是这可能会将单独的零“0”替换为空白。
                【解决方案16】:
                       String s="0000000000046457657772752256266542=56256010000085100000";      
                    String removeString="";
                
                    for(int i =0;i<s.length();i++){
                      if(s.charAt(i)=='0')
                        removeString=removeString+"0";
                      else 
                        break;
                    }
                
                    System.out.println("original string - "+s);
                
                    System.out.println("after removing 0's -"+s.replaceFirst(removeString,""));
                

                【讨论】:

                  【解决方案17】:

                  如果您不想使用正则表达式或外部库。 您可以使用“for”:

                  String input="0000008008451"
                  String output = input.trim();
                  for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));
                  
                  System.out.println(output);//8008451
                  

                  【讨论】:

                  • 在这个循环中生成了太多String...如果有1000个0...
                  【解决方案18】:

                  我做了一些基准测试,发现最快的方法(到目前为止)是这个解决方案:

                      private static String removeLeadingZeros(String s) {
                        try {
                            Integer intVal = Integer.parseInt(s);
                            s = intVal.toString();
                        } catch (Exception ex) {
                            // whatever
                        }
                        return s;
                      }
                  

                  特别是正则表达式在长时间迭代中非常慢。 (我需要找出批处理作业的最快方法。)

                  【讨论】:

                  • 这不适用于字母数字,但它确实适用于我的用途。
                  【解决方案19】:

                  使用 kotlin 很容易

                  value.trimStart('0')
                  

                  【讨论】:

                    【解决方案20】:

                    那么只搜索第一个非零字符呢?

                    [1-9]\d+
                    

                    此正则表达式查找 1 到 9 之间的第一个数字,后跟任意数量的数字,因此对于 "00012345",它返回 "12345"。 它可以很容易地适应字母数字字符串。

                    【讨论】:

                    • 这之后也不允许归零。
                    猜你喜欢
                    • 2013-03-31
                    • 1970-01-01
                    • 2014-06-25
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-04-09
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多