Verwenden Sie String.split () mit mehreren Trennzeichen

201

Ich muss eine String-Basis auf Trennzeichen -und teilen .. Unten sind meine gewünschten Ausgaben.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

aber mein folgender Code funktioniert nicht.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}
Thang Pham
quelle
Basierend auf dem, was Sie gesagt haben, sieht es so aus, als ob es gut funktioniert. Was ist Ihre gewünschte Ausgabe?
Jeff
2
@ Jeff: Er zeigte seine gewünschte Ausgabe ( AA/ BB/ CC...)
TJ Crowder
2
Bist du sicher? Ich interpretierte das als seine aktuelle Ausgabe, nicht als seine gewünschte Ausgabe. Vielleicht ist es Zeit aufzustehen und ein bisschen herumzulaufen.
Jeff
@ Jeff: Entschuldigung für die Verwirrung, ich habe meinen Beitrag aktualisiert, um Ihr Missverständnis zu beseitigen.
Thang Pham
Regex beeinträchtigt Ihre Leistung. Ich würde empfehlen, eine Methode zu schreiben, die zeichenweise und bei Bedarf die Zeichenfolge teilt. Sie können dies weiter optimieren, um die Leistung von log (n) zu erhalten.
Princesh

Antworten:

311

Ich denke, Sie müssen den Regex- OR-Operator einschließen :

String[]tokens = pdfName.split("-|\\.");

Was Sie haben, wird übereinstimmen:
[DASH gefolgt von DOT zusammen] -.
nicht
[DASH oder DOT eines von ihnen] -oder.

Richard H.
quelle
9
Warum benötigen wir zwei Backslashes?
pjain
7
Das .Zeichen in Regex bedeutet ein anderes Zeichen als eine neue Zeile. tutorialspoint.com/java/java_regular_expressions.htm In diesem Fall wollten sie jedoch den tatsächlichen Charakter .. Die beiden Backslashes zeigen an, dass Sie sich beziehen .. Der Backslash ist ein Escape-Charakter.
Monkeygrinder
2
für Normalfall wäre es .split("match1|match2"), (z. B. split("https|http")\\ ist das besondere Zeichen zu entkommen) .in obiger Fall
prayagupd
oder im Allgemeinen können Sie pdfName.split("\\W");wie unten @Peter Knego Antwort verwenden
ahmednabil88
1
Verwenden Sie [-.]anstelle von-|\\.
Saeed
49

Versuchen Sie diesen regulären Ausdruck "[-.]+". Das + nach behandelt aufeinanderfolgende Trennzeichen als eins. Entfernen Sie plus, wenn Sie dies nicht möchten.

Peter Knego
quelle
8
@Lurkers: Der einzige Grund, warum Peter nicht entkommen musste, -war, dass es der erste Gedanke in der war [], sonst müsste es einen Backslash davor geben (und natürlich, um einen Backslash davor zu setzen, wir brauche zwei, weil dies ein String-Literal ist).
TJ Crowder
Ich denke, diese Antwort ist besser als die akzeptierte, denn wenn Sie den logischen Operator | verwenden, besteht das Problem darin, dass einer Ihrer Begrenzer Teil Ihrer Ergebnis-Token sein kann. Dies wird nicht mit Peter Knegos [-.] +
Jack '
26

Sie können den regulären Ausdruck "\ W" verwenden. Dies entspricht jedem Nicht-Wort-Zeichen. Die erforderliche Zeile wäre:

String[] tokens=pdfName.split("\\W");
Varun Gangal
quelle
es funktioniert bei mir nicht `String s =" id (INT), name (STRING), ". Wenn Sie hier \\ W verwenden, wird ein Array mit der Länge 6 erstellt, wobei es nur 4 sein sollte
user3527975
2
Dies wird auch unterbrochen, wenn die Eingabe ein Unicode-Zeichen enthält. Es ist am besten, nur das eigentliche Trennzeichen einzuschließen, anstatt ein "Alles greifen" mit \W.
nhahtdh
13

Die Zeichenfolge, die Sie geben split ist die Zeichenfolgenform eines regulären Ausdrucks.

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Das bedeutet, dass []wir uns auf jedes Zeichen in der Zeichenfolge aufteilen müssen (wir müssen -mit einem Backslash entkommen, weil es innen etwas Besonderes ist []; und natürlich müssen wir dem Backslash entkommen, weil dies eine Zeichenfolge ist). (Umgekehrt .ist es normalerweise etwas Besonderes, aber innen nichts Besonderes [].)

TJ Crowder
quelle
In diesem Fall müssen Sie dem Bindestrich nicht entkommen, da er [-.]möglicherweise nicht als Bereich interpretiert werden kann.
Alan Moore
1
@ Alan: Weil es das allererste in der Klasse ist, ist das ganz richtig. Aber ich mache es immer, es ist zu einfach, später zurückzugehen und etwas davor hinzuzufügen, ohne nachzudenken. Es kostet nichts, also ...
TJ Crowder
Weißt du, wie du den Klammern entkommen kannst? Ich habe String "[200] Engineering", den ich in "200", "Engineering"
Scottysseus
3
Oh wow, ich habe es verstanden ... Ich musste zwei Backslashes anstelle von einem verwenden. String[] strings = codes.get(x).split("\\[|\\]| ");<- Code für alle Interessierten
Scottysseus
4

Für zwei Zeichenfolgen als Trennzeichen "UND" und "ODER" sollte dies funktionieren. Vergessen Sie nicht, während des Gebrauchs zu trimmen.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Ergebnis: Städte = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSKAU"}

ÖMER TAŞCI
quelle
Wie kann ich Ausgaben wie {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"} erhalten
Ahamadullah Saikat
3

Ich würde Apache Commons verwenden:

importieren org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Es wird auf jedes der angegebenen Trennzeichen aufgeteilt, im Gegensatz dazu StringUtils.splitByWholeSeparator(str, separator)wird die vollständige Zeichenfolge als Trennzeichen verwendet

Edd
quelle
3
String[] token=s.split("[.-]");
Nitish
quelle
9
Bitte helfen Sie dabei, das Missverständnis zu bekämpfen, dass StackOverflow ein kostenloser Code-Schreibdienst ist, indem Sie Ihre Nur-Code-Antwort mit einigen Erklärungen ergänzen.
Yunnosch
2

Es ist besser, so etwas zu verwenden:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

Habe ein paar andere Zeichen als Beispiel hinzugefügt. Dies ist der sicherste Weg, weil der Weg .und 'behandelt wird.

Pritam Banerjee
quelle
1

Sie können auch einen regulären Ausdruck als Argument in der split () -Methode angeben. Siehe Beispiel unten ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}
Avdhesh Yadav
quelle
1

Versuchen Sie diesen Code:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);
Sensenmann
quelle
1
Bitte helfen Sie dabei, das Missverständnis zu bekämpfen, dass StackOverflow ein kostenloser Code-Schreibdienst ist, indem Sie Ihre Nur-Code-Antwort mit einigen Erklärungen ergänzen.
Yunnosch
0
s.trim().split("[\\W]+") 

sollte arbeiten.

sss
quelle
2
Erstens, nein, es funktioniert nicht - vielleicht können Sie es vor dem Posten versuchen? Dann ist diese Antwort dieselbe wie Ihre - aber sie funktioniert. Schließlich sollten Sie Ihre Formatierung überprüfen ( sollte funktionieren. ).
Arount
1
Bitte helfen Sie dabei, das Missverständnis zu bekämpfen, dass StackOverflow ein kostenloser Code-Schreibdienst ist, indem Sie Ihre Nur-Code-Antwort mit einigen Erklärungen ergänzen.
Yunnosch
-1

Wenn Sie wissen, dass der Stich immer das gleiche Format hat, teilen Sie zuerst die Zeichenfolge basierend auf .und speichern Sie die Zeichenfolge am ersten Index in einer Variablen. Teilen Sie dann die Zeichenfolge im zweiten Index basierend auf -und speichern Sie die Indizes 0, 1 und 2. Schließlich teilen Sie den Index 2 des vorherigen Arrays basierend auf .und Sie sollten alle relevanten Felder erhalten haben.

Siehe folgenden Ausschnitt:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...
isometrik
quelle
6
Dies kann in einem Schritt erfolgen, also in einem Schritt. Siehe die anderen Antworten.
Kaj
2
pdfName.split(".")führt zu einem Array mit der Länge Null.
Alan Moore
1) .Muss als\\.
Shri