Ich bin neu in regulären Ausdrücken und würde mich über Ihre Hilfe freuen. Ich versuche, einen Ausdruck zusammenzustellen, der die Beispielzeichenfolge unter Verwendung aller Leerzeichen aufteilt, die nicht in einfache oder doppelte Anführungszeichen gesetzt sind. Mein letzter Versuch sieht so aus: (?!")
und funktioniert nicht ganz. Es teilt sich auf dem Platz vor dem Zitat auf.
Beispieleingabe:
This is a string that "will be" highlighted when your 'regular expression' matches something.
Gewünschte Ausgabe:
This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.
Beachten Sie dies "will be"
und 'regular expression'
behalten Sie den Abstand zwischen den Wörtern bei.
Antworten:
Ich verstehe nicht, warum alle anderen so komplexe reguläre Ausdrücke oder so langen Code vorschlagen. Im Wesentlichen möchten Sie zwei Arten von Dingen aus Ihrer Zeichenfolge herausholen: Zeichenfolgen, die keine Leerzeichen oder Anführungszeichen sind, und Zeichenfolgen, die mit einem Anführungszeichen ohne dazwischen liegende Anführungszeichen beginnen und enden, für zwei Arten von Anführungszeichen. Sie können diese Dinge leicht mit diesem regulären Ausdruck abgleichen:
Ich habe die Erfassungsgruppen hinzugefügt, weil Sie die Anführungszeichen nicht in der Liste haben möchten.
Dieser Java-Code erstellt die Liste, fügt die Erfassungsgruppe hinzu, wenn sie übereinstimmt, um die Anführungszeichen auszuschließen, und fügt die allgemeine Regex-Übereinstimmung hinzu, wenn die Erfassungsgruppe nicht übereinstimmt (ein nicht zitiertes Wort wurde abgeglichen).
Wenn es Ihnen nichts ausmacht, die Anführungszeichen in der zurückgegebenen Liste zu haben, können Sie viel einfacheren Code verwenden:
quelle
\"
?John's mother
Ergebnisse aufgeteilt in[John, s, mother]
"([^"]*)"|'([^']*)'|[^\s]+
."([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+
. Siehe stackoverflow.com/questions/5695240/…Es gibt mehrere Fragen zu StackOverflow, die dieselbe Frage in verschiedenen Kontexten mit regulären Ausdrücken behandeln. Zum Beispiel:
UPDATE : Beispiel-Regex für Zeichenfolgen mit einfachen und doppelten Anführungszeichen. Ref: Wie kann ich eine Zeichenfolge teilen, außer in Anführungszeichen?
Getestet mit einem schnellen Perl-Snippet und die Ausgabe war wie unten wiedergegeben. Funktioniert auch für leere Zeichenfolgen oder Nur-Leerzeichen-Zeichenfolgen, wenn sie zwischen Anführungszeichen stehen (nicht sicher, ob dies gewünscht wird oder nicht).
Beachten Sie, dass dies die Anführungszeichen selbst in den übereinstimmenden Werten enthält. Sie können diese jedoch durch Ersetzen einer Zeichenfolge entfernen oder den regulären Ausdruck so ändern, dass sie nicht enthalten sind. Ich lasse das vorerst als Übung für den Leser oder ein anderes Poster, da 2 Uhr morgens viel zu spät ist, um sich nicht mehr mit regulären Ausdrücken zu beschäftigen;)
quelle
Wenn Sie maskierte Anführungszeichen in der Zeichenfolge zulassen möchten, können Sie Folgendes verwenden:
In Anführungszeichen gesetzte Zeichenfolgen sind Gruppe 2, einzelne nicht in Anführungszeichen gesetzte Wörter sind Gruppe 3.
Sie können es hier an verschiedenen Zeichenfolgen ausprobieren: http://www.fileformat.info/tool/regex.htm oder http://gskinner.com/RegExr/
quelle
Der Regex von Jan Goyvaerts ist die beste Lösung, die ich bisher gefunden habe, erstellt aber auch leere (Null-) Übereinstimmungen, die er in seinem Programm ausschließt. Diese leeren Übereinstimmungen werden auch von Regex-Testern (z. B. rubular.com) angezeigt. Wenn Sie die Suche umdrehen (suchen Sie zuerst nach den zitierten Teilen und dann nach den durch Leerzeichen getrennten Wörtern), können Sie dies einmal tun mit:
quelle
Dies entspricht den Leerzeichen, die nicht in doppelte Anführungszeichen gesetzt sind. Ich muss min, max {0,99999} verwenden, da Java * und + im Lookbehind nicht unterstützt.
quelle
Es wird wahrscheinlich einfacher sein, die Zeichenfolge zu durchsuchen, jedes Teil zu greifen, als es zu teilen.
Grund dafür ist, dass Sie es an den Stellen davor und danach aufteilen lassen können
"will be"
. Ich kann mir jedoch keine Möglichkeit vorstellen, den Abstand zwischen einem Split zu ignorieren.(nicht aktuelles Java)
Das Erfassen einfacher Anführungszeichen kann außerdem zu Problemen führen:
quelle
String.split()
ist hier nicht hilfreich, da es keine Möglichkeit gibt, zwischen Leerzeichen innerhalb von Anführungszeichen (nicht teilen) und Leerzeichen außerhalb (in Teilen) zu unterscheiden.Matcher.lookingAt()
ist wahrscheinlich was Sie brauchen:welches die folgende Ausgabe erzeugt:
quelle
Ich mochte Marcus 'Ansatz, aber ich habe ihn so modifiziert, dass ich Text in der Nähe der Anführungszeichen zulassen und sowohl "als auch' Anführungszeichen unterstützen kann. Zum Beispiel brauchte ich einen =" Wert ", um ihn nicht in [a =," aufzuteilen. ein Wert "].
quelle
Jan's Ansatz ist großartig, aber hier ist noch einer für die Aufzeichnung.
Wenn Sie tatsächlich wie im Titel erwähnt aufteilen und die Anführungszeichen in
"will be"
und beibehalten möchten'regular expression'
, können Sie diese Methode verwenden, die direkt aus ist beibehalten möchten, können einem Muster übereinstimmt (oder dieses ersetzt), außer in den Situationen s1, s2, s3 usw.Die Regex:
Die beiden linken Abwechslungen stimmen vollständig
'quoted strings'
und überein"double-quoted strings"
. Wir werden diese Übereinstimmungen ignorieren. Die rechte Seite stimmt mit Leerzeichen der Gruppe 1 überein und erfasst diese. Wir wissen, dass es sich um die richtigen Leerzeichen handelt, da sie nicht mit den Ausdrücken auf der linken Seite übereinstimmen. Wir ersetzen diese durchSplitHere
dann aufgeteilt aufSplitHere
. Auch dies ist für einen echten Split-Fall, wo Sie wollen"will be"
, nichtwill be
.Hier ist eine voll funktionsfähige Implementierung (siehe die Ergebnisse in der Online-Demo ).
quelle
Wenn Sie c # verwenden, können Sie verwenden
Ich habe speziell " | <(? [\ W \ s] *)> " hinzugefügt, um hervorzuheben, dass Sie Zeichen für Gruppenphrasen angeben können. (In diesem Fall verwende ich <> zum Gruppieren.
Ausgabe ist:
quelle
Ich bin mir ziemlich sicher, dass dies mit regulären Ausdrücken allein nicht möglich ist. Das Überprüfen, ob etwas in einem anderen Tag enthalten ist, ist eine Analyseoperation. Dies scheint das gleiche Problem zu sein wie der Versuch, XML mit einem regulären Ausdruck zu analysieren - es kann nicht korrekt durchgeführt werden. Möglicherweise können Sie das gewünschte Ergebnis erzielen, indem Sie wiederholt einen nicht gierigen, nicht globalen regulären Ausdruck anwenden, der mit den angegebenen Zeichenfolgen übereinstimmt. Wenn Sie dann nichts anderes finden, teilen Sie ihn an den Stellen auf, die eine Reihe von haben Probleme, einschließlich der Verfolgung der ursprünglichen Reihenfolge aller Teilzeichenfolgen. Am besten schreiben Sie einfach eine wirklich einfache Funktion, die über die Zeichenfolge iteriert und die gewünschten Token herauszieht.
quelle
Ein paar hoffentlich hilfreiche Änderungen an Jans akzeptierter Antwort:
quelle
you're
Sie können dies auch versuchen:
quelle
Im Folgenden wird ein Array von Argumenten zurückgegeben. Argumente sind die Variablen 'Befehl', die auf Leerzeichen aufgeteilt sind, sofern sie nicht in einfache oder doppelte Anführungszeichen gesetzt sind. Die Übereinstimmungen werden dann geändert, um die einfachen und doppelten Anführungszeichen zu entfernen.
quelle
1. Einzeiler mit String.split ()
[This, is, a, string, that, "will be", highlighted, when, your, 'regular expression', matches, something.]
Teilen Sie das Leerzeichen nicht auf, wenn das Leerzeichen in einfache oder doppelte Anführungszeichen gesetzt ist
die am Leerzeichen geteilt werden, wenn die 255 Zeichen links und alle Zeichen rechts vom Leerzeichen weder einfache noch doppelte Anführungszeichen sind
angepasst vom ursprünglichen Beitrag (behandelt nur doppelte Anführungszeichen)
quelle