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.
Können Sie uns ein Beispiel dafür, was die Zeichenfolge werden sollte? – Druzion
Was wird erwartet? Was ist mit '12-10'? –
Ist das erwartete Ergebnis für das obige Beispiel "121-023-555-583-61"? –