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

我看到过关于如何在SO中加上0前缀的问题。但不是相反!

你们能建议我如何去掉字母数字文本中的前导零吗?是否有任何内置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
394207 次浏览

你可以用regex替换"^0*(.*)""$1"

使用Apache Commons StringUtils类:

StringUtils.strip(String str, String stripChars);

那么regex的方法呢:

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

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

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

Regex是这项工作的最佳工具;它应该是什么取决于问题的规格说明。以下语句删除前导0,但在必要时保留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+(?!$)", "") + "]");
}

另请参阅

与前面提到的Apache Commons答案一样:使用guava-libraries(谷歌的通用Java实用程序库,我认为它现在应该在任何非平凡Java项目的类路径中),这将使用CharMatcher:

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

一种不需要regExp和任何外部库的清晰方法。

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";
}

对组使用Regexp:

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;

用这个:

String x = "00123".replaceAll("^0*", ""); // -> 123
       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,""));

你可以像这样使用Apache Commons Lang中的stringutil类:

StringUtils.stripStart(yourString,"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

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

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

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

如果只搜索第一个非零字符呢?

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

使用regex作为一些答案建议是一个很好的方法。如果你不想使用regex,你可以使用下面的代码:

String s = "00a0a121";


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

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

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

结果是:

3 d0g ss 0 0 0

没有在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
}
你可以这样做: String s = Integer.valueOf("0001007").toString(); < / p >

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

yourString.trimStart('0')

使用kotlin很容易

value.trimStart('0')