Mit Ruby, wie kann ich eine einzige Regex verwenden, um alle Vorkommen von 'y' in "xy y ay xy + y" zu finden, denen NICHT x vorangestellt ist (y, ay, + y)?
/[^ x] y/passt zu den vorhergehenden Zeichen, also brauche ich eine Alternative ...regexp um mit string1 übereinzustimmen, außer mit string2
Antwort
Sie benötigen eine Negative-Look-Behind-Assertion mit einer Breite von Null. Versuchen Sie /(?<!x)y/
, die genau sagt, wonach Sie suchen, d. H. Finden Sie alle 'y' nicht vor 'x', aber nicht das vorherige Zeichen, das ist die Null-Breite Teil.
Bearbeitet hinzuzufügen: Anscheinend wird dies nur von Ruby 1.9 und höher unterstützt.
In PCRE, verwenden Sie einen negativen Blick hinter:
(:<!x)y
Nicht sicher, ob dies unterstützt von Ruby, aber Sie können immer nachschlagen.
Es kann hinter mit negativem Blick erfolgen, (?<!x)y
Rubin leider nicht negativ Lookbehind nicht unterstützt, so dass Sie Probleme haben, wenn Sie mehr als ein einzelnes Zeichen zu suchen. Für nur einen Charakter, können Sie sich darum kümmern, indem das Spiel erfassen:
/[^x](y)/
Ah, ich bin kein Ruby-Experte - jbourque sagt negative Lookbehind ist in neueren Ruby. Da ist deine echte Antwort. – Cascabel
[^ x] muss mit einem Zeichen übereinstimmen. Wenn y am Anfang der Zeile vorkommt, sollten wir es anpassen:/(?: \ A |^| [^ x]) y / –
Negativen Blick hinter bis Ruby nicht 1.9 unterstützt, aber Sie können etwas ähnliches mit Scan tun:
"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]]
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]} # => ["y", "y", "y"]
Das ist natürlich viel schwieriger, wenn Sie viel mehr als ein einzelnes Zeichen vor dem y
vermeiden wollen. Dann würden Sie haben so etwas wie zu tun:
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/} # => [[" ", "y"], [" ball", "y"], [" +", "y"]]
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]} # => ["y", "y" "y"]
- 1. grep Befehl für Dateien mit "String1" AND NOT "String2"
- 2. Grep Suche alle Dateien im Verzeichnis nach String1 UND String2
- 3. Wie füge ich mehrere Elemente in String1 mit einem Element in String2 zusammen? C/C++
- 4. Wie lautet das richtige Regexp-Muster, um mit einem VMS-Dateinamen übereinzustimmen?
- 5. Hat C# ein VB.NET-Äquivalent für die Abkürzung von Arrays wie {"string1", "string2"}?
- 6. wie grep verwenden, um entweder mit whitespace oder newline übereinzustimmen
- 7. Verwenden von preg_match, um mit diesem spezifischen Muster übereinzustimmen
- 8. Regexp: Wie alles außer einem anderen Regexp zu entfernen?
- 9. string1> = string2 nicht in Linq zu SQL, keine Workaround implementiert?
- 10. AS3 - RegExp mit Sonderzeichen
- 11. Wie kann ich meine Regex beheben, um nicht zu viel mit einem gierigen Quantifizierer übereinzustimmen?
- 12. Was ist die Regex, um mit allem außer einem doppelten Anführungszeichen übereinzustimmen, dem kein Backslash vorangestellt ist?
- 13. regexp mit russischer Sprache
- 14. das Spiel Inhalt von zwei verschiedenen regexp in Perl
- 15. Javascript regexp Spiel mit Ausnahme
- 16. Java Stringparsing mit Regexp
- 17. mySQL Regexp mit eckigen Klammern
- 18. Hilfe mit regexp
- 19. Probleme mit Regexp
- 20. Invert Übereinstimmung mit regexp
- 21. Javascript RegExp mit .test()
- 22. Swift UITextField, um Array von Zeichenfolgen übereinzustimmen, wenn Benutzer Kleinbuchstaben
- 23. regexp JavaScript, um Datum Problem
- 24. PHP regexp um Zahlen mit HTML-Tags in Strings
- 25. Hilfe mit Regexp, um Werte aus den Klammern zu extrahieren
- 26. Verwenden von Regexp mit Sphinx
- 27. C# Regex, um mit einer Zeichenfolge übereinzustimmen, die keine bestimmte Zeichenfolge enthält?
- 28. CSS: verschiebe ein "float: right" -Element nach oben (um mit dem ersten Element der Liste übereinzustimmen)
- 29. javascript regexp für Wortgrenze Erkennung mit Klammer
- 30. Austauschen von Buchstaben mit Regexp
Ich wollte eine negative Lookbehind vorschlagen, aber es sieht aus wie Sie aus Glück in dieser Hinsicht sind: http://www.regular-expressions.info /lookaround.html#limitbehind. * "Flavors wie JavaScript, Ruby und Tcl unterstützen Lookhind überhaupt nicht, obwohl sie Lookahead unterstützen." * –
Siehe auch http://StackOverflow.com/questions/530441/how-would-you-use- a-regular-expression-to-ignore-strings-das-enthält-eine-spezifische – finnw
Wenn Look-Back-Assertions nicht unterstützt werden, könnten wir folgendes verwenden: '([^ x] y") | (^ y ")' . 'y' könnte am Anfang des Strings stehen und dieser Fall wird nicht von '/ [^ x] y /' abgedeckt. – approxiblue