2016-03-29 18 views
1

Ich habe eine Zeichenfolge aus Ziffern. Ich muss diese Ziffern im Block der Länge drei gruppieren und durch einzelnen Strich trennen. Falls erforderlich, kann der letzte Block oder die letzten zwei Blöcke die Länge zwei haben. Eine Zeichenfolge in Dreierblöcke aufteilen?

String abc = "12-10 23 5555 8361"; 
    String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
    // now how can I group them in blocks of length three? 
+0

Können Sie uns ein Beispiel dafür, was die Zeichenfolge werden sollte? – Druzion

+0

Was wird erwartet? Was ist mit '12-10'? –

+0

Ist das erwartete Ergebnis für das obige Beispiel "121-023-555-583-61"? –

Antwort

1

Sie können eine \G innerhalb eines Lookbehind basierten regex verwenden:

String abc = "12-10 23 5555 8361"; 
String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
System.out.println(hello.replaceAll("(?<=\\G\\d{3})", "-")); 
// => 121-023-555-583-61 

Siehe IDEONE demo

Die (?<=\\G\\d{3}) regex nur eine Breite von Null Behauptung enthält, die eine Position zu Beginn entspricht der die Zeichenfolge oder am Ende der letzten erfolgreichen Übereinstimmung (\G), gefolgt von 3 Ziffern (\d{3}). In Java regex funktioniert dieses Muster im aktuellen Szenario gut (d. H. \G verschiebt den Regex-Index innerhalb von Lookbehind). Dies funktioniert jedoch nicht in Android.

UPDATE:

Für die aktualisierten Anforderungen können Sie einen mehrstufigen Ansatz wie

public static void main (String[] args) throws java.lang.Exception 
{ 
    String s = "0 - 22 1985--324"; // => 022-198-53-24 
    run(s); 
    s = "555372654"; // => 555-372-654 
    run(s); 
    s = "12-10 23 5555 8361"; // => 121-023-555-583-61 
    run(s); 
} 
public static void run(String abc) { 
    String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
    hello = hello.replaceAll("(?<=\\G\\d{3})(?!$)", "-"); 
    System.out.println(hello.replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3")); 
} 

Siehe verwenden another IDEONE demo

Die Regex mit (?!$) am Ende aktualisiert sind, dass nicht die Übereinstimmung am Ende der Zeichenfolge.

Die .replaceAll("\\b(\\d{2})(\\d+)-(\\d)$", "$1-$2$3") ist notwendig, um die 2 letzten Zifferngruppen am Ende neu anzuordnen: Wenn 3 oder mehr Ziffern gefolgt von einem Bindestrich und dann nur 1 Ziffer folgen, müssen wir den Bindestrich nach den ersten 2 Ziffern verschieben, und verschiebe die anderen Ziffern direkt nach diesem Bindestrich.

+0

@ user1950349: Könnten Sie bitte Ihre Frage mit den relevanten Details aktualisieren? Und bieten eine genaue erwartete Ausgabe für einige Beispielzeichenfolgen. –

1

Sie können auch drei Ziffern gruppieren und durch erfasste Gruppe und - ersetzen.

Regex:(\d{3})

Ersatz zu tun: Ersetzen mit \1-

Java-Code

String abc = "12-10 23 5555 8361"; 
String hello = abc.replaceAll("[^a-zA-Z0-9]", ""); 
System.out.println(hello.replaceAll("(\\d{3})", "$1-")); 

Regex101 Demo

Ideone Demo

+1

Für diese Nummer '555372654' endet sie mit dem abschließenden' -'. – user1950349

+0

@ user1950349: Lassen Sie mich überprüfen. –

+0

Und jeder Block sollte mindestens zwei Ziffern haben, so dass für dieses Beispiel '0 - 22 1985--324' es fehlschlägt, wenn ich' 022-198-532-4 'bekomme. Stattdessen sollte ich '022-198-53-24' verwenden – user1950349

Verwandte Themen