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

我已经看到如何在SO这里前缀零的问题。 但不是另一种方式!

你们可以build议我如何删除字母数字文本中的前导零? 有没有内置的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 

正则expression式是工作的最佳工具; 它应该取决于问题规范。 以下删除前导零,但如果必要的话留下一个(即它不会只是"0"空白string)。

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

^锚将确保匹配的0+在input的开始处。 (?!$)负向前视确保不会匹配整个string。

testing装置:

 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+(?!$)", "") + "]"); } 

也可以看看

  • regular-expressions.info
    • 重复 , lookarounds和锚点
  • String.replaceFirst(String regex)

您可以使用Apache Commons Lang中的StringUtils类,如下所示:

 StringUtils.stripStart(yourString,"0"); 

如何正则expression式的方式:

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

^锚定到string的开头(我从上下文中假定您的string不是多行的,否则您可能需要查看\A开始input,而不是开始行)。 0*表示零个或多个0字符(也可以使用0+ )。 replaceFirst只是在开始时将所有这些0字符replace为replaceFirst

如果像Vadzim那样,前导零的定义不包括把"0" (或"000"或类似的string)转换成一个空string(一个合理的预期),只要有必要就把它放回去:

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

无需任何regExp和任何外部库的清晰方法。

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

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

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

使用Apache Commons的StringUtils类:

 StringUtils.strip(String str, String stripChars); 

在组中使用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开始循环,直到find一个不为零的字符为止。

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

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

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

特别是正则expression式在很长的迭代中非常缓慢。 (我需要找出批量作业的最快方法。)

使用正则expression式作为一些答案build议是一个很好的方法来做到这一点。 如果你不想使用正则expression式,那么你可以使用这个代码:

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

你可以用"^0*(.*)"正则expression式"$1"replace"^0*(.*)""$1"

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

如果你不想使用正则expression式或外部库。 你可以用“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-9]\d+ 

这个正则expression式find1到9之间的第一个数字,后面跟着任意数字,所以对于“00012345”它返回“12345” 。 它可以很容易地适用于字母数字string。

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

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

这导致:

 3 d0g ss 0 0 0 

如果不使用正则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 }