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("-\\.");
}

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.


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.


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");

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 [].)


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"}


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


3
String[] token=s.split("[.-]");

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.


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("-|\\.");
}

1

Versuchen Sie diesen Code:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

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.


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];
...

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.