簡體   English   中英

如何從字母數字文本中刪除前導零?

[英]How to remove leading zeros from alphanumeric text?

我已經看到有關如何在 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

正則表達式是完成這項工作的最佳工具; 它應該是什么取決於問題規范。 以下刪除前導零,但在必要時保留一個(即它不會只是將"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 Lang 中StringUtils類:

StringUtils.stripStart(yourString,"0");

正則表達式怎么樣:

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

^錨定到字符串的開頭(我從上下文假設你的字符串在這里不是多行的,否則你可能需要查看\\A以獲取輸入的開頭而不是行的開頭)。 0*表示零個或多個0字符(您也可以使用0+ )。 replaceFirst只是在開始時將所有這些0字符替換為replaceFirst

如果像 Vadzim 一樣,您對前導零的定義不包括將"0" (或"000"或類似字符串)轉換為空字符串(足夠合理的期望),則只需在必要時將其放回原處:

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

一種無需正則表達式和任何外部庫的清晰方法。

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

如果您使用 Kotlin,這是您唯一需要的代碼:

yourString.trimStart('0')

要使用 thelost 的 Apache Commons 答案:使用guava-libraries (我認為 Google 的通用 Java 實用程序庫現在應該在任何非平凡的 Java 項目的類路徑上),這將使用CharMatcher

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

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

用這個:

String x = "00123".replaceAll("^0*", ""); // -> 123

使用 Apache Commons StringUtils類:

StringUtils.strip(String str, String stripChars);

使用正則表達式作為一些答案建議是一個很好的方法來做到這一點。 如果您不想使用正則表達式,則可以使用以下代碼:

String s = "00a0a121";

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

對組使用正則表達式:

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;

我認為這樣做很容易。 您可以從頭開始遍歷字符串並刪除零,直到找到非零字符。

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

如果您(像我一樣)需要從字符串中的每個“單詞”中刪除所有前導零,您可以將@polygenelubricants 的答案修改為以下內容:

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

這導致:

3 d0g ss 0 0 0

如果Regex 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="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,""));

您可以用正則表達式將"^0*(.*)"替換為"$1"

如果您不想使用正則表達式或外部庫。 你可以用“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;
    }

特別是正則表達式在長迭代中非常慢。 (我需要找出批處理作業的最快方法。)

使用 kotlin 很容易

value.trimStart('0')

那么只搜索第一個非零字符呢?

[1-9]\d+

此正則表達式查找 1 到 9 之間的第一個數字,后跟任意數量的數字,因此對於"00012345"它返回"12345" 它可以很容易地適應字母數字字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM