Ich frage mich, ob ich eine Saite .
richtig spalten werde ? Mein Code lautet:
String[] fn = filename.split(".");
return fn[0];
Ich brauche nur den ersten Teil der Zeichenfolge, deshalb gebe ich den ersten Artikel zurück. Ich frage, weil ich in der API bemerkt habe, dass .
dies ein beliebiges Zeichen bedeutet, also stecke ich jetzt fest.
Ich sehe hier nur Lösungen, aber keine vollständige Erklärung des Problems, deshalb habe ich beschlossen, diese Antwort zu posten
Problem
Sie müssen einige Dinge wissen
text.split(delim)
.split
Methode:delim
am Ende vontext
like in existierta,b,c,,
(wo Trennzeichen ist,
) vorhanden ist,split
wird zunächst ein Array like erstellt,["a" "b" "c" "" ""]
aber da wir diese nachgestellten leeren Zeichenfolgen in den meisten Fällen nicht wirklich benötigen, werden sie auch automatisch für uns entfernt. Es wird also ein weiteres Array ohne diese nachfolgenden leeren Zeichenfolgen erstellt und zurückgegeben .Sie müssen auch wissen, dass der Punkt
.
ein Sonderzeichen ist in Regex ist . Es stellt ein beliebiges Zeichen dar (außer Zeilentrennzeichen, dies kann jedoch mit demPattern.DOTALL
Flag geändert werden ).Also für String wie
"abc"
wenn wir auf"."
split
Methode teilen["" "" "" ""]
,was bedeutet, dass wir als Ergebnis ein leeres Array erhalten
[]
(ohne Elemente, nicht einmal leere Zeichenfolge), sodass wir es nicht verwenden können,fn[0]
da es keinen Index 0 gibt.Lösung
Um dieses Problem zu lösen, müssen Sie lediglich einen regulären Ausdruck erstellen, der den Punkt darstellt. Dazu müssen wir dem entkommen
.
. Es gibt nur wenige Möglichkeiten, dies zu tun, aber die einfachste ist wahrscheinlich die Verwendung von\
(was in String als"\\"
weil geschrieben werden muss\
es dort auch etwas Besonderes ist und erfordert, dass ein anderer\
maskiert wird).Die Lösung Ihres Problems könnte also so aussehen
Bonus
Sie können auch andere Möglichkeiten verwenden, um diesem Punkt zu entkommen
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
Flagsplit(Pattern.quote("."))
und lassen Sie Regex für Sie entkommen.quelle
split("[.]")
Die String # split (String) -Methode verwendet reguläre Ausdrücke. In regulären Ausdrücken wird das "." Zeichen bedeutet "beliebiges Zeichen". Sie können dieses Verhalten vermeiden, indem Sie entweder das "."
oder die Split-Methode anweisen, bei einer Zeichenklasse zu teilen:
Zeichenklassen sind Sammlungen von Zeichen. Du könntest schreiben
und Dateiname würde bei jedem "-", ".", ";", "l", "d" oder "7" aufgeteilt. Innerhalb von Zeichenklassen wird das "." ist kein Sonderzeichen ("Metazeichen").
quelle
Da DOT (.) Als Sonderzeichen betrachtet wird und die Split-Methode von String einen regulären Ausdruck erwartet, müssen Sie dies wie folgt tun:
In Java müssen die Sonderzeichen mit einem "\" maskiert werden. Da "\" auch in Java ein Sonderzeichen ist, müssen Sie es erneut mit einem anderen "\" maskieren!
quelle
quelle
Wäre es nicht effizienter zu bedienen?
Wenn Sie nur wollen, was ist bis zum ersten Punkt?
quelle
Normalerweise ist es keine gute Idee, es von Hand zu entlarven. In der Pattern-Klasse gibt es eine Methode für diese Aufgabe:
quelle
Die Aufteilung muss Regex als Argument nehmen ... Wechseln Sie einfach
"."
zu"\\."
quelle
Hinweis: Bei diesem Snippet ist weitere Vorsicht geboten, auch wenn der Punkt nicht mehr angezeigt wird!
Wenn der Dateiname nur die Zeichenfolge "." Ist, hat fn immer noch die Länge 0 und fn [0] löst immer noch eine Ausnahme aus!
Dies liegt daran, dass beim Teilen mindestens einmal übereinstimmende leere Zeichenfolgen (also auch die vor dem Punkt!) Aus dem Array entfernt werden, wenn das Muster mindestens einmal übereinstimmt , sodass ein leeres Array zurückgegeben werden muss.
quelle
Die Lösung, die für mich funktioniert hat, ist die folgende
quelle
Mit ApacheCommons ist es am einfachsten:
Beachten Sie, dass auch ein Dateiname aus dem vollständigen Pfad extrahiert wird.
quelle
split
nimmt einen regulären Ausdruck als Argument. So sollten Sie passieren"\."
statt ,"."
da"."
ist ein Metazeichen in regulären Ausdruck.quelle