Hallo
angenommen man hat folgenden String:
"abc\~def~ghi"
Ziel ist es, den String durch das Zeichen "~" zu trennen, allerdings nur dann wenn vor dem Zeichen kein Escapezeichen steht. Die split[] Methode von java erlaubt eine reg. Expression anzugeben und mein erster Versuch war:
split("[^\\\\]~")
Ist natürlich falsch weil auch das vorherige Zeichen abgeschnitten wird. Kann mir da jemand weiterhelfen?
Sebastian
spezielle Reg. Expression / split[]
-
-
Schaut für mich so aus, als ob das mit split nicht gehen würde. Falls es wirklich nur um diese eine spezielle Anwendung geht, würde ich wohl einfach mit "~" splitten und gegebenenfalls wieder Strings zusammenpasten. Das dürfte recht schnell hingeschrieben sein.
Wenn doch mehr nötig ist oder das effizienter sein muß, brauchst du was mächtigeres.
-
Zitat
Ziel ist es, den String durch das Zeichen "~" zu trennen, allerdings nur dann wenn vor dem Zeichen kein Escapezeichen steht.
Du musst eigentlich nur die Anzahl der \ davor zählen. Es könnte ja auch \\~ stehen -- somit wäre die Tilde nicht mehr escaped.
Bei gerader Anzahl: nicht splitten; bei ungerader: splitten. -
Kniet nieder vor dem zero-width negative lookbehind operator ?<! :cool: :
PHP
Alles anzeigenpackage at.bookworm.test.tuwien; import static org.junit.Assert.*; import org.junit.Test; public class RegexLookbehindTest { @Test public void doNotSplitAtEscape() { String str = "abc\\~def~ghi"; String[] results = str.split("(?<![^\\\\]\\\\)~"); assertEquals(2, results.length); assertEquals("abc\\~def", results[0]); assertEquals("ghi", results[1]); } @Test public void doSplitAtDoubleEscape() { String str = "abc\\\\~def~ghi"; String[] results = str.split("(?<![^\\\\]\\\\)~"); assertEquals(3, results.length); assertEquals("abc\\\\", results[0]); assertEquals("def", results[1]); assertEquals("ghi", results[2]); } }
-
hmmm ... mit dem split() fällt mir das fürs Erste auch nicht eleganter ein, als dass man die "\~" an jedes Element < n wieder hinzufügen müsste ...
Vielleicht willst Du Dir aber mal den StringTokenizer anschauen ... ?
P.S.: Lösung oberhalb scheint eleganter zu sein ...
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!