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

jai*_*jai 205 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 converts to 2829839
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 579

正则表达式是这项工作的最佳工具; 应该是什么取决于问题规范.以下删除前导零,但必要时留下一个(即它不会只是转为"0"空字符串).

s.replaceFirst("^0+(?!$)", "")
Run Code Online (Sandbox Code Playgroud)

^主播将确保该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+(?!$)", "") + "]");
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 谢谢.你已经无情地测试了;)太棒了!测试+1. (19认同)
  • 这在Kotlin中不起作用,你需要明确关于Regex` .replaceFirst("^ 0 +(?!$)".toRegex(),"")` (5认同)
  • @Greg:这个问题是关于Java,而不是JavaScript.自版本1.4以来,Java SE已经拥有方法[String.replaceFirst()](http://bit.ly/MCZfrt). (4认同)
  • 将trim()添加到s.replaceFirst("^ 0 +(?!$)","")(即.s.trim().replaceFirst("^ 0 +(?!$)","")将有助于在删除填充空间! (4认同)
  • 对于这么简单的任务,正则表达式有点贵吗? (2认同)
  • 对于 kotlin,使用更清晰:`yourString.trimStart('0')` (2认同)

小智 90

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

StringUtils.stripStart(yourString,"0");
Run Code Online (Sandbox Code Playgroud)

  • 如果单独在“0”上使用它,它会返回“”。所以请注意这是否不是所需的预期效果。 (3认同)

pax*_*blo 30

正则表达方式怎么样:

String s = "001234-a";
s = s.replaceFirst ("^0*", "");
Run Code Online (Sandbox Code Playgroud)

^字符串开头的锚点(我假设从上下文中你的字符串不是多行的,否则你可能需要查看输入\A的开始而不是行的开始).该0*方法零个或多个0字符(你可以使用0+为好).在replaceFirst刚刚替换所有那些0在一开始什么也没有的字符.

如果像Vadzim一样,你对前导零的定义不包括将"0"(或"000"类似的字符串)转换为空字符串(理性足够的期望),只需在必要时将其放回去:

String s = "00000000";
s = s.replaceFirst ("^0*", "");
if (s.isEmpty()) s = "0";
Run Code Online (Sandbox Code Playgroud)

  • 它仅有"0"的问题. (6认同)

Sam*_*ari 22

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

yourString.trimStart('0')
Run Code Online (Sandbox Code Playgroud)


mag*_*ter 18

一个明确的方式,无需任何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";
}
Run Code Online (Sandbox Code Playgroud)


Cow*_*wan 13

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

CharMatcher.is('0').trimLeadingFrom(inputString);
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以这样做: String s = Integer.valueOf("0001007").toString();

  • 不会处理字母数字。 (5认同)

Edu*_*omo 6

用这个:

String x = "00123".replaceAll("^0*", ""); // -> 123
Run Code Online (Sandbox Code Playgroud)


the*_*ost 5

使用Apache Commons StringUtils类:

StringUtils.strip(String str, String stripChars);
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用StringUtils.stripStart()仅剥离前导零. (18认同)
  • 警告!这将去除开头和结尾的零,这可能不是您想要的。 (2认同)