webentwicklung-frage-antwort-db.com.de

Wie entferne ich führende Nullen aus alphanumerischem Text?

Ich habe in SO gesehen, wie man Nullen voranstellen kann. Aber nicht andersherum!

Können Sie mir vorschlagen, die führenden Nullen in alphanumerischem Text zu entfernen? Gibt es integrierte APIs oder muss ich eine Methode zum Trimmen der führenden Nullen schreiben?

Beispiel:

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
184
jai

Regex ist das beste Werkzeug für den Job. was es sein sollte, hängt von der Problemspezifikation ab. Folgendes entfernt führende Nullen, hinterlässt aber ggf. eine (d. H. Es würde nicht einfach "0" in eine leere Zeichenfolge umwandeln).

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

Der ^-Anker stellt sicher, dass der 0+, der abgeglichen wird, am Anfang der Eingabe steht. Der (?!$) negative Lookahead stellt sicher, dass nicht die gesamte Zeichenfolge übereinstimmt.

Testgeschirr:

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

Siehe auch

533

Sie können die StringUtils class aus Apache Commons Lang wie folgt verwenden:

StringUtils.stripStart(yourString,"0");
75

Wie wäre es mit dem Regex-Weg:

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

Der ^ verankert sich am Anfang des Strings (Ich gehe davon aus, dass Ihre Strings hier nicht mehrzeilig sind, andernfalls müssen Sie \A für den Anfang der Eingabe anstelle des Zeilenanfangs suchen). Der 0* bedeutet null oder mehr 0 Zeichen (Sie könnten verwenden auch 0+). Die Variable replaceFirst ersetzt einfach alle diese 0-Zeichen am Anfang durch nichts.

Und wenn Ihre Definition der führenden Nullen nicht wie bei Vadzim darin enthalten ist, "0" (oder "000" oder ähnliche Zeichenfolgen) in eine leere Zeichenfolge umzuwandeln (eine hinreichend begründete Erwartung), setzen Sie sie bei Bedarf einfach zurück:

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

Ein klarer Weg ohne RegExp und externe Bibliotheken.

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

Um mit der Apache-Commons-Antwort von theLost zu gehen: using guava-libraries (Googles AllzweckJava Hilfsprogrammbibliothek, von der ich behaupten würde, dass sie jetzt auf dem Klassenpfad eines beliebigen Nicht-Trivialen sein sollte Java project) würde dies CharMatcher verwenden:

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

Verwenden Sie Apache Commons StringUtils class:

StringUtils.strip(String str, String stripChars);
5
thelost

Benutze das:

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

Die Verwendung von Regex als Antwort darauf ist ein guter Weg, dies zu tun. Wenn Sie keine Regex verwenden möchten, können Sie diesen Code verwenden:

String s = "00a0a121";

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

Verwenden von Regexp mit Gruppen:

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;
2
brj

Sie könnten einfach folgendes tun: String s = Integer.valueOf("0001007").toString();

1
Damjan

Wenn Sie (wie ich) alle führenden Nullen von jedem "Word" in einer Zeichenfolge entfernen müssen, können Sie die Antwort von @polygenelubricants folgendermaßen ändern:

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

was in ... resultiert:

3 d0g ss 0 0 0
1
xdhmoore

Ich denke, dass das so einfach ist. Sie können den String einfach von Anfang an durchlaufen und Nullen entfernen, bis Sie ein Zeichen gefunden haben, das nicht Null ist.

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

Wenn Sie Kotlin verwenden Dies ist der einzige Code, den Sie benötigen:

yourString.trimStart('0')
0
Saman Sattari

Sie könnten "^0*(.*)" durch regex durch "$1" ersetzen

0
YOU

Ich habe einige Benchmark-Tests gemacht und festgestellt, dass der schnellste Weg (bei weitem) diese Lösung ist:

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

Besonders reguläre Ausdrücke sind in einer langen Iteration sehr langsam. (Ich musste den schnellsten Weg für einen Batchjob herausfinden.)

0

Ohne Regex oder substring()-Funktion für String zu verwenden, was ineffizient sein wird -

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
    }
0
Sachin Aggarwal
       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
Ajit Kumar Sahu

Wenn Sie keine regulären Ausdrücke oder externe Bibliotheken verwenden möchten, können Sie mit "für": 

String input="0000008008451"
String output = input.trim();
for( ;output.length() > 1 && output.charAt(0) == '0'; output = output.substring(1));

System.out.println(output);//8008451
0
kfatih