2016-04-21 9 views
1

Ich muss eine Zeichenfolge basierend auf einem Muster teilen und wieder muss ich es wieder auf einen Teil der Zeichenfolge zusammenführen.Split eine Zeichenfolge basierend auf Muster und füge es zurück

für ex: Im Folgenden sind die tatsächlichen und erwarteten Zeichenfolgen.

Wenn ich unten verwende, kann ich in einem Array speichern und iterieren, um es zurück zu bekommen. Ist es trotzdem möglich, kann es einfach und effizient als unten getan werden.

String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+"); 

Obwohl ich die Zeichenfolge auf indexbasierte Acess kann, gibt es eine andere Möglichkeit, dies leicht zu tun. Bitte beraten.

+0

Wenn Sie einen String aufteilen und in einem String-Array speichern, bleibt der ursprüngliche String unverändert. Also warum zusammenführen? Sie können diese ursprüngliche Zeichenfolge verwenden. –

+0

Nun, Sie brauchen nur das '\. \\\\\\\\\\\\\' nur einmal in '[' '' '' '' '' und vereinfachen Sie Ihre Regex zu '[\\. \\ s] +'. –

Antwort

1

würde ich einen replaceAll in diesem Fall benutzen

String actualstr="abc.def.ghi.jkl.mno"; 
String str = actualstr.replaceAll("\\..*\\.", "."); 

Dies wird alles mit dem ersten und letzten . mit einem ersetzen .

Sie auch Split

String[] parts = actualString.split("\\."); 
string str = parts[0]+"."+parts[parts.length-1]; // first and last word 
+0

Danke. Funktioniert für mich :) – Karthik

2

nutzen könnten Sie tun nicht verstehen, wie Regexes funktionieren.

Hier ist Ihre regex ohne die Fluchten: [\.\.\.\.\.\s]+

Sie eine Zeichenklasse haben ([]). Was bedeutet, dass es keinen Grund gibt, mehr als eine . darin zu haben. Sie müssen auch nicht . s in einer Char-Klasse entkommen.

Hier ist eine entsprechende Regex zu Ihrer Regex: [.\s]+. Als Java String ist das: "[.\\s]+".


Sie können .split("regex") auf Zeichenfolge tun eine Reihe zu bekommen. Es ist sehr einfach, von diesem Punkt an eine Lösung zu finden.

+0

oh mein Schlechter. Danke für die Kommentare. :) – Karthik

1
public static String merge(String string, String delimiter, int... partnumbers) 
{ 
    String[] parts = string.split(delimiter); 

    String result = ""; 

    for (int x = 0 ; x < partnumbers.length ; x ++) 
    { 
     result += result.length() > 0 ? delimiter.replaceAll("\\\\","") : ""; 
     result += parts[partnumbers[x]]; 
    } 

    return result; 
} 

und es dann gerne verwenden:

merge("abc.def.ghi.jkl.mno", "\\.", 0, 4); 
1

Ich würde

Pattern pattern = Pattern.compile("(\\w*\\.).*\\.(\\w*)"); 
    Matcher matcher = pattern.matcher("abc.def.ghi.jkl.mno"); 
    if (matcher.matches()) { 
     System.out.println(matcher.group(1) + matcher.group(2)); 
    } 

es auf diese Weise tun, wenn Sie das Ergebnis der

Pattern.compile("(\\w*\\.).*\\.(\\w*)") 

und Wiederverwendung zwischenspeichern können " Muster "noch einmal wird dieser Code sehr effizient sein Die Musterzusammenstellung ist am teuersten. Die java.lang.String.split() -Methode, die von anderen Antworten vorgeschlagen wird, verwendet dieselbe Pattern.compile() -Methode intern, wenn die Musterlänge größer als 1 ist. Dies bedeutet, dass diese aufwendige Operation der Musterkompilierung bei jedem Aufruf der Methode ausgeführt wird. Siehe java.util.regex - importance of Pattern.compile()?. Es ist also viel besser, das Muster kompilieren und zwischenspeichern und wiederverwenden zu lassen.

matcher.group (1) bezieht sich auf die erste Gruppe von() die "(\ w * \.)" Ist matcher.group (2) bezieht sich auf den zweiten, der "(\ w *)" ist

obwohl wir es hier nicht verwenden, aber nur um festzustellen, dass Gruppe (0) die Übereinstimmung für die gesamte Regex ist.

Verwandte Themen