如何从字母数字文本中删除前导零?

309

我在stackoverflow上看到了有关如何在数字前面添加零的问题。但是没有关于反过来的问题!

你们能否建议我如何删除字母数字文本中的前导零?是否存在内置的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
21个回答

2

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

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

这导致:
3 d0g ss 0 0 0

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;

2
使用 Kotlin 很容易。
value.trimStart('0')

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());

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
    }

0

我进行了一些基准测试,并发现最快的方法(远远超过其他方法)是这个解决方案:

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

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


1
这对字母数字无效,但对于我的用途有效。 - Brett Slocum

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,""));

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

1
我唯一看到的问题是,这可能会将单个零“0”替换为空白。 - Dilipkumar J

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

1
在这个循环中生成了太多的“String”...如果有1000个“0”... - AxelH

-2

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

[1-9]\d+

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


1
这也不允许之后的零。 - Nishant Dongare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接