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

Java 如何从字母数字文本中删除前导零?,java,string,alphanumeric,Java,String,Alphanumeric,我看到过关于如何在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

我看到过关于如何在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
您可以使用regex将
“^0*(.*)”
替换为
“$1”
,使用Apache Commons类:


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());
int lastLeadZeroIndex=0;
对于(int i=0;i
正则表达式是完成这项工作的最佳工具;它应该是什么取决于问题规范。下面将删除前导零,但在必要时保留一个(即,它不会将
“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答案:使用(我认为谷歌的通用Java实用程序库现在应该位于任何非平凡Java项目的类路径上),这将使用:


一种无需任何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";
}
公共静态字符串TrimLeadingZero(字符串源){
对于(int i=0;i
将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”;
字符串重新投资=”;
对于(int i=0;i,您可以使用下面的类:

StringUtils.stripStart(yourString,"0");

如果您不想使用正则表达式或外部库。 您可以使用“for”:


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

    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”
它可以很容易地适应字母数字字符串。

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

String s = "00a0a121";

while(s.length()>0 && s.charAt(0)=='0')
{
   s = s.substring(1); 
}
如果您(像我一样)需要删除字符串中每个“单词”的所有前导零,您可以修改@Polygene的答案如下:

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

3 d0g ss 0 0 0

如果不使用
String
上的
Regex
substring()
函数,则效率低下-

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

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

yourString.trimStart('0')

使用kotlin很容易

value.trimStart('0')


谢谢你。你已经进行了无情的测试;)太好了+1用于测试。@Greg:这个问题是关于Java的,不是关于JavaScript的。Java SE从1.4版开始就有了这个方法。将trim()添加到s.replaceFirst(“^0+(?!$)”,”)(即s.trim().replaceFirst(“^0+(?!$)”,”)将有助于删除填充空格!对于这样一个简单的任务,正则表达式不是有点昂贵吗?这在Kotlin中不起作用,您需要明确地说明正则表达式
。replaceFirst(“^0+(?!$)”)。toRegex(),“)
警告!这将去除前导零和结尾零,这可能不是您想要的。您可以使用StringUtils.stripStart()仅去除前导零。我在这里看到的唯一问题是,这可能会将一个单独的零“0”替换为空白。+1是使用Guava的任何项目的正确答案。(现在在2012年,这将意味着几乎所有Java项目。)@Cowan单独使用“0”有问题吗?Will CharMatcher.is('0')。trimLeadingFrom(“0”);返回“0”或空字符串?@Phoonne:我刚刚测试过这个;它返回空字符串。它单独使用“0”有问题。单独使用“0”有问题吗?@Hamilton Rodrigue如果单独使用“0”,它会返回“”。因此,如果这不是所需的预期效果,请小心。因为它适用于所问问题中的用例。在这里也帮了我一个快速解决方案。Thx!虽然您的空间检查与问题不符,但我认为您的答案将执行得最快。@JohnFowler 10x用于捕获,2年以上后修复,方法如果循环只找到零,则d需要在结尾处返回。返回“”;或返回“0”;如果您至少想要一个zero@slipperyseal我让它打开,以便您可以根据需要更改它,但由于人们倾向于复制/粘贴,因此始终使用默认行为不是一个坏主意。感谢您的评论,这可能会创建大量的
String
…改为使用。在循环过程中生成的
String
太多…如果ere是1000
0
…无法处理
String s = "003 d0g 00ss 00 0 00";
s.replaceAll("\\b0+(?!\\b)", "");
3 d0g ss 0 0 0
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
    }
yourString.trimStart('0')
value.trimStart('0')