2009-07-03 10 views
2

In Java verwende ich die String-Split-Methode, um eine Zeichenfolge zu trennen, die durch Semikolons getrennte Werte enthält.Wie spalte ich eine Zeichenfolge unter Verwendung eines regulären Ausdrucks, der eine maskierte Version meines Tokens ausschließt?

Derzeit habe ich die folgende Zeile, die in 99% aller Fälle funktioniert.

String[] fields = optionsTxt.split(";"); 

Allerdings hat die Forderung entkam Semikolons als Teil der Zeichenfolge enthalten hinzugefügt. So sollten die folgenden Zeichenfolgen auf die folgenden Werte parsen:

"Foo foo;Bar bar" => [Foo foo] [Bar bar] 
"Foo foo\; foo foo;Bar bar bar" => [Foo foo\; foo foo] [Bar bar bar] 

Dieser sollte schmerzlich einfach, aber ich bin total unsicher, wie man das macht. Ich möchte nur nicht Tokenize wenn es ein \ gibt; und nur wenn es ein gibt;

Kennt jemand die Zauberformel?

+1

Können die Token Backslashes enthalten? Wenn ja, müssten sie auch entkommen, oder? –

+0

In meinem Anwendungsfall ist das Token ein einzelnes Semikolon, das nie maskiert wurde. Wenn Sie ein Backslash-Token haben möchten, benötigen Sie einen anderen Ansatz. – Elijah

Antwort

2

versuchen Sie dies:

String[] fields = optionsTxt.split("(?<!\\\\);"); 
1

Es gibt wahrscheinlich einen besseren Weg, aber die schnelle und schmutzige Methode wäre, zuerst zu ersetzen \; mit einer Zeichenfolge, die nicht in Ihren Eingabepuffern erscheint, wie {{ESCAPED_SEMICOLON}}, dann tun Sie die Tokenize auf; und wenn Sie dann jedes Token herausziehen, wird die ursprüngliche Ersetzung in umgekehrter Reihenfolge ausgeführt, um das \;

+0

Dies ist einfacher als die Verwendung von Regex. :) – nightingale2k1

+0

Das ist wirklich hacky und funktioniert nicht, wenn Sie Backslashes entkommen können. Wenn Sie haben \\\\\\; (bedeutet, dass Sie 3 umgekehrte Schrägstriche haben möchten, und teilen Sie das Semikolon, Sie werden nicht mit dem richtigen Ergebnis wegen der Ersetzung enden. – Tom

1

Verwenden eines regulären Ausdrucks (java.util.regex)

[^\\]; 

sollte das sein, was Sie suchen, ein Doppel ersetzen, ohne zu tun.

try it out using a tool like this

+0

Diese Regex verbraucht das Zeichen vor dem Semikolon sowie das Semikolon selbst. Wenn Sie auf teilen , alle außer dem letzten Token werden ihr letztes Zeichen abgehackt haben. –

0

Mit nur Beispiele, um Ihre zur Verfügung gestellt, können Sie Objekte Code von oben verwenden. Wenn Sie die Split wollen nur geschehen, wenn eine es gerade Anzahl von Schrägstriche vor Ihrer Semikolon, versuchen Sie dies:

String[] fields = optionsTxt.split("((?<!\\\\)|(?<=[^\\\\](\\\\\\\\){0,15}));"); 

Ich habe 15 willkürlich ausgewählt. Ändern Sie es gegebenenfalls in eine höhere Zahl.