Frage

Ruby-Verwendung, wie kann ich eine einzelne Regex alle Vorkommen von 'y' passen in "xy y ay xy + y", die von x nicht vorangestellt (y, y, + y)?
/ [^ X] y / entspricht auch das vorhergehende Zeichen, so brauche ich eine Alternative ...

War es hilfreich?

Lösung

Sie müssen eine Breite von Null negativ Blick hinter Behauptung. Versuchen Sie /(?<!x)y/ die sagt genau das, was Sie suchen, das heißt finden alle ‚y‘ nicht von ‚x‘ vorangestellt, nicht jedoch den Stand der Charakter, der die Null-Breite Teil ist.

Edited hinzufügen:. Anscheinend nur von Ruby 1.9 und höher unterstützt wird

Andere Tipps

Negativer Blick hinter erst Rubin unterstützt 1.9, aber Sie können etwas ähnliches tun Scan mit:

"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"]

Natürlich, das ist viel schwieriger, wenn Sie viel mehr als ein einzelne 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"]

Rubin leider nicht unterstützt negative Lookbehind, so dass Sie Schwierigkeiten haben werden, wenn Sie für mehr als ein einzelnes Zeichen zu suchen. Für nur einen Charakter, man kann darum kümmern durch das Spiel erfassen:

/[^x](y)/

In PCRE, verwenden Sie einen negativen Blick hinter:

(:<!x)y

Nicht sicher, ob dies von Ruby unterstützt, aber man kann immer schauen.

Es kann hinter mit negativem Blick erfolgen, (?<!x)y

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top