我看到过关于如何在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

当前回答

那么regex的方法呢:

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

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

如果像Vadzim一样,你对前导零的定义不包括将“0”(或“000”或类似的字符串)转换为空字符串(一个足够合理的期望),那么在必要时简单地将它放回去:

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

其他回答

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

StringUtils.stripStart(yourString,"0");

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

CharMatcher.is('0').trimLeadingFrom(inputString);
       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,""));

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

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

另请参阅

regular-expressions.info 重复、环视和锚定 字符串。replaceFirst(字符串正则表达式)