278

我已经在 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
4

20 回答 20

712

正则表达式是这项工作的最佳工具;它应该是什么取决于问题规范。以下内容删除了前导零,但在必要时留下了一个(即它不会只是变成"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+(?!$)", "") + "]");
}

也可以看看

于 2010-05-10T06:53:22.067 回答
137

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

StringUtils.stripStart(yourString,"0");
于 2013-12-17T19:16:21.943 回答
36

正则表达式方式怎么样:

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";
于 2010-05-10T06:32:58.347 回答
29

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

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";
}
于 2011-08-17T08:29:54.867 回答
27

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

yourString.trimStart('0')
于 2019-08-19T14:00:47.613 回答
15

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

CharMatcher.is('0').trimLeadingFrom(inputString);
于 2010-05-10T10:08:24.240 回答
10

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

于 2018-10-11T10:40:31.590 回答
6

用这个:

String x = "00123".replaceAll("^0*", ""); // -> 123
于 2013-01-17T19:42:02.210 回答
5

使用 Apache CommonsStringUtils类:

StringUtils.strip(String str, String stripChars);
于 2010-05-10T06:32:43.060 回答
2

将正则表达式与组一起使用:

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;
于 2012-03-15T06:48:09.443 回答
2

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

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}
于 2016-03-11T22:45:11.763 回答
1

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

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());
于 2010-05-10T06:34:01.277 回答
1

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

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

这导致:

3 d0g ss 0 0 0
于 2017-05-19T16:08:41.617 回答
1

没有使用Regexsubstring()功能String将是低效的 -

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
    }
于 2017-10-01T06:10:37.597 回答
0

你可以"^0*(.*)""$1"正则表达式替换

于 2010-05-10T06:32:21.867 回答
0
       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,""));
于 2013-01-23T10:45:56.270 回答
0

如果您不想使用正则表达式或外部库。你可以用“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
于 2015-11-05T08:49:13.097 回答
0

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

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

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

于 2016-02-18T15:48:49.697 回答
0

使用 kotlin 很容易

value.trimStart('0')
于 2021-04-19T04:38:12.887 回答
-2

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

[1-9]\d+

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

于 2016-03-04T12:01:23.170 回答