Verwenden Sie einfach die entsprechende Methode : String#split()
.
String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556
Beachten Sie, dass dies ein regulärer Ausdruck ist. Denken Sie daher daran, bei Bedarf Sonderzeichen zu maskieren.
Es gibt 12 Zeichen mit besonderen Bedeutungen: den Backslash \
, das Caret ^
, das Dollarzeichen $
, den Punkt oder Punkt .
, den vertikalen Balken oder das Rohrsymbol |
, das Fragezeichen ?
, das Sternchen oder den Stern *
, das Pluszeichen +
, die öffnende Klammer (
, die schließende Klammer )
und die öffnende eckige Klammer [
, die öffnende geschweifte Klammer {
. Diese Sonderzeichen werden oft als "Metazeichen" bezeichnet.
Wenn Sie also z. B. Punkt / Punkt teilen möchten, .
was " beliebiges Zeichen " in Regex bedeutet, verwenden Sie entweder einen umgekehrten Schrägstrich\
, um das einzelne Sonderzeichen so zu umgehen split("\\.")
, oder verwenden Sie die Zeichenklasse[]
, um Literalzeichen wie diese darzustellen split("[.]")
, oder verwenden Sie Pattern#quote()
to entkomme der ganzen Schnur so split(Pattern.quote("."))
.
String[] parts = string.split(Pattern.quote(".")); // Split on period.
Um vorher zu testen, ob die Zeichenfolge bestimmte Zeichen enthält, verwenden Sie einfach String#contains()
.
if (string.contains("-")) {
// Split it.
} else {
throw new IllegalArgumentException("String " + string + " does not contain -");
}
Beachten Sie, dass dies keinen regulären Ausdruck erfordert. Verwenden Sie dazu String#matches()
stattdessen.
Wenn Sie das geteilte Zeichen in den resultierenden Teilen beibehalten möchten , verwenden Sie einen positiven Lookaround . Wenn Sie möchten, dass das geteilte Zeichen auf der linken Seite landet, verwenden Sie ein positives Lookbehind, indem Sie ?<=
dem Muster eine Gruppe voranstellen .
String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556
Wenn Sie möchten, dass das geteilte Zeichen auf der rechten Seite landet, verwenden Sie einen positiven Lookahead, indem Sie ?=
dem Muster eine Gruppe voranstellen.
String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556
Wenn Sie die Anzahl der resultierenden Teile begrenzen möchten, können Sie die gewünschte Anzahl als zweites Argument der split()
Methode angeben.
String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
reugalr expression
wird ein Elementarray mit ganzer Zeichenfolge zurückgegeben.Eine Alternative zur direkten Verarbeitung der Zeichenfolge wäre die Verwendung eines regulären Ausdrucks mit Erfassungsgruppen. Dies hat den Vorteil, dass es einfacher ist, komplexere Einschränkungen für die Eingabe zu implizieren. Im Folgenden wird beispielsweise die Zeichenfolge in zwei Teile aufgeteilt und sichergestellt, dass beide nur aus Ziffern bestehen:
Da das Muster in diesem Fall festgelegt ist, kann es im Voraus kompiliert und als statisches Element gespeichert werden (im Beispiel zum Laden der Klasse initialisiert). Der reguläre Ausdruck lautet:
Die Klammern kennzeichnen die Erfassungsgruppen. Auf die Zeichenfolge, die mit diesem Teil des regulären Ausdrucks übereinstimmt, kann wie gezeigt mit der Match.group () -Methode zugegriffen werden. Das \ d stimmt mit einer einzelnen Dezimalstelle überein, und das + bedeutet "mit einem oder mehreren der vorherigen Ausdrücke übereinstimmen". Das - hat keine besondere Bedeutung, stimmt also nur mit diesem Zeichen in der Eingabe überein. Beachten Sie, dass Sie die Backslashes doppelt maskieren müssen Wenn Sie dies als Java-Zeichenfolge schreiben. Einige andere Beispiele:
quelle
m.group(1)
der zweite Teil seinm.group(2)
, dam.group(0)
tatsächlich das vollständige Übereinstimmungsmuster zurückgegeben wird. Ich denke, ich erinnere mich auch darangroup(0)
, dass früher das erste Match statt des vollständigen Musters war. Vielleicht hat sich dies in einem kürzlich durchgeführten Update der Java-Version geändert.Dadurch wird Ihre Saite in zwei Teile geteilt. Das erste Element im Array ist der Teil, der das Material vor dem enthält
-
, und das zweite Element im Array enthält den Teil Ihres Strings nach dem-
.Wenn die Array-Länge nicht 2 ist, hatte die Zeichenfolge nicht das Format :
string-string
.Überprüfen Sie die
split()
Methode in derString
Klasse.quelle
sollte tun, was du willst. Die String-Klasse verfügt über viele Methoden zum Arbeiten mit String.
quelle
quelle
StringTokenizer
handelt sich um eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl von ihrer Verwendung in neuem Code abgeraten wird . Es wird empfohlen, dass jeder, der diese Funktionalität sucht , stattdessen diesplit
MethodeString
oder dasjava.util.regex
Paket verwendet."Mit Java 8:
quelle
.map(String::trim)
nach demsplit
Die Anforderungen ließen Interpretationsspielraum. Ich empfehle eine Methode zu schreiben,
die diese Funktion kapseln. Natürlich können Sie String.split (..) verwenden, wie in den anderen Antworten für die Implementierung erwähnt.
Sie sollten einige Unit-Tests für Eingabezeichenfolgen und die gewünschten Ergebnisse und Verhaltensweisen schreiben.
Gute Testkandidaten sollten Folgendes umfassen:
Mit der Definition der entsprechenden Testergebnisse können Sie das Verhalten festlegen.
Zum Beispiel, wenn zurückgegeben werden
"-333"
soll[,333]
oder wenn es sich um einen Fehler handelt. Kann"333-333-33"
getrennt werden[333,333-33] or [333-333,33]
oder ist es ein Fehler? Und so weiter.quelle
Sie können dies auch versuchen
quelle
Vorausgesetzt, dass
Am einfachsten ist es, StringUtils # split (java.lang.String, char) zu verwenden . Dies ist praktischer als die von Java sofort bereitgestellte, wenn Sie keine regulären Ausdrücke benötigen. Wie das Handbuch sagt, funktioniert es folgendermaßen:
Ich würde empfehlen, commong-lang zu verwenden, da es normalerweise viele Dinge enthält, die verwendet werden können. Wenn Sie es jedoch nur für einen Split benötigen, ist es besser, sich selbst zu implementieren oder dem regulären Ausdruck zu entkommen.
quelle
Verwenden Sie die Split-Methode von org.apache.commons.lang.StringUtils, mit der Zeichenfolgen basierend auf dem Zeichen oder der Zeichenfolge, die Sie teilen möchten, aufgeteilt werden können.
Methodensignatur:
In Ihrem Fall möchten Sie eine Zeichenfolge teilen, wenn ein "-" vorhanden ist.
Sie können einfach wie folgt vorgehen:
Ausgabe:
Angenommen, wenn
-
in Ihrer Zeichenfolge keine vorhanden ist, wird die angegebene Zeichenfolge zurückgegeben, und Sie erhalten keine Ausnahme.quelle
Zusammenfassend: Es gibt mindestens fünf Möglichkeiten, eine Zeichenfolge in Java zu teilen:
String.split ():
Pattern.compile (regulärer Ausdruck) .splitAsStream (Eingabe):
StringTokenizer (Legacy-Klasse):
Google Guava Splitter:
Apache Commons StringUtils:
So können Sie die für Sie beste Option auswählen, je nachdem, was Sie benötigen, z. B. den Rückgabetyp (Array, Liste oder iterierbar).
Hier finden Sie eine große Übersicht über diese Methoden und die häufigsten Beispiele (Aufteilen nach Punkten, Schrägstrichen, Fragezeichen usw.).
quelle
Der schnellste Weg, der auch die geringste Ressource verbraucht, könnte sein:
quelle
string1 = s.substring(0, s.indexOf("-"));
string2 = s.substring(s.indexOf("-") + 1);
daraus. Sie erhalten dasStringIndexOutOfBoundsException
automatisch, wenn es kein "-" gab.String Mit Regex mit mehreren Zeichen teilen
Ausgabe:
Erwarten Sie jedoch nicht für alle JDK-Versionen dieselbe Ausgabe. Ich habe einen Fehler gesehen, der in einigen JDK-Versionen vorhanden ist, in denen die erste Nullzeichenfolge ignoriert wurde. Dieser Fehler ist in der neuesten JDK-Version nicht vorhanden, tritt jedoch in einigen Versionen zwischen späten JDK 1.7-Versionen und frühen 1.8-Versionen auf.
quelle
Für einfache Anwendungsfälle
String.split()
sollte die Arbeit erledigen. Wenn Sie Guave verwenden, gibt es auch eine Splitter- Klasse, die die Verkettung verschiedener Zeichenfolgenoperationen ermöglicht und CharMatcher unterstützt :quelle
quelle
Mit der folgenden Anweisung können Sie eine Zeichenfolge durch einen Zeilenumbruch teilen:
Mit der folgenden Anweisung können Sie eine Zeichenfolge durch einen Bindestrich / ein Zeichen teilen:
quelle
quelle
Sie können Split () verwenden:
Andernfalls können Sie StringTokenizer verwenden:
quelle
Es gibt nur zwei Methoden, die Sie wirklich berücksichtigen müssen.
Verwenden Sie String.split für ein einstelliges Trennzeichen, oder Sie interessieren sich nicht für die Leistung
Wenn die Leistung kein Problem darstellt oder wenn das Trennzeichen ein einzelnes Zeichen ist, das kein Sonderzeichen für reguläre Ausdrücke ist (dh keines von
.$|()[{^?*+\
), können Sie es verwendenString.split
.Die Split-Methode verfügt über eine Optimierung, um die Verwendung eines regulären Ausdrucks zu vermeiden, wenn das Delimeter ein einzelnes Zeichen ist und nicht in der obigen Liste enthalten ist. Andernfalls muss ein regulärer Ausdruck kompiliert werden, was nicht ideal ist.
Verwenden Sie Pattern.split und kompilieren Sie das Muster vor, wenn Sie ein komplexes Trennzeichen verwenden und die Leistung wichtig ist.
Wenn die Leistung ein Problem darstellt und Ihr Trennzeichen nicht eines der oben genannten ist, sollten Sie ein Muster für reguläre Ausdrücke vorkompilieren, das Sie dann wiederverwenden können.
Diese letzte Option erstellt immer noch ein neues
Matcher
Objekt. Sie können dieses Objekt auch zwischenspeichern und für jede Eingabe zurücksetzen, um maximale Leistung zu erzielen. Dies ist jedoch etwas komplizierter und nicht threadsicher.quelle
Eine Möglichkeit, dies zu tun, besteht darin, den String in einer for-each-Schleife zu durchlaufen und das erforderliche geteilte Zeichen zu verwenden.
Ausgabe:
quelle
Bitte verwenden Sie keine StringTokenizer- Klasse, da es sich um eine Legacy-Klasse handelt, die aus Kompatibilitätsgründen beibehalten wird und deren Verwendung in neuem Code nicht empfohlen wird. Und wir können auch die von anderen vorgeschlagene Split-Methode verwenden.
Und wie erwartet wird es gedruckt:
In dieser Antwort möchte ich auch auf eine Änderung
split
hinweisen, die für die Methode in Java 8 vorgenommen wurde . Die String # split () -Methode verwendetPattern.split
und entfernt jetzt leere Strings am Anfang des Ergebnisarrays. Beachten Sie diese Änderung in der Dokumentation für Java 8:Dies bedeutet für das folgende Beispiel:
Wir werden drei Zeichenfolgen erhalten:
[0, 0, 4]
und nicht vier, wie dies in Java 7 und früher der Fall war. Überprüfen Sie auch diese ähnliche Frage .quelle
Hier sind zwei Möglichkeiten, wie zwei es erreichen können.
WEG 1: Da Sie zwei Zahlen durch ein Sonderzeichen teilen müssen, können Sie Regex verwenden
WEG 2: Verwenden der String-Split-Methode
quelle
Sie können StringTokenizer einfach verwenden, um eine Zeichenfolge in zwei oder mehr Teile aufzuteilen, unabhängig davon, ob es Trennzeichen gibt:
quelle
Überprüfen Sie die
split()
Methode in derString
Klasse auf Javadoc.Hier viele Beispiele für geteilte Zeichenfolgen, aber ich habe wenig Code optimiert.
quelle
-
durch|
und sehen, was passiert :)quelle
Ich wollte nur einen Algorithmus schreiben, anstatt die in Java integrierten Funktionen zu verwenden:
quelle
Sie können die Methode verwenden
split
:quelle
Verwenden Sie zum Teilen eines Strings String.split (Regex). Überprüfen Sie die folgenden Beispiele:
Ausgabe
Hinweis:
Diese Aufteilung (Regex) verwendet einen Regex als Argument. Denken Sie daran, die Regex-Sonderzeichen wie Punkt / Punkt zu umgehen.
quelle
quelle
Verwenden Sie zum Teilen einer Zeichenfolge
String.split(regex)
:Ausgabe:
quelle