regex per abbinare stringa1 a meno che non sia preceduto dalla stringa 2
-
06-07-2019 - |
Domanda
Usando Ruby, come posso usare una singola regex per abbinare tutte le occorrenze di 'y' in " xy y ay xy + y " che NON sono preceduti da x (y, ay, + y)?
/ [^ x] y / corrisponde anche al carattere precedente, quindi ho bisogno di un'alternativa ...
Soluzione
È necessaria un'asserzione negativa di larghezza zero. Prova /(?<!x)y/
che dice esattamente quello che stai cercando, ovvero trova tutti 'y' non preceduti da 'x', ma non include il carattere precedente, che è la parte di larghezza zero.
Modificato per aggiungere: a quanto pare questo è supportato solo da Ruby 1.9 e versioni successive.
Altri suggerimenti
Il look-behind negativo non è supportato fino a Ruby 1.9, ma puoi fare qualcosa di simile usando scan:
"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"]
Naturalmente, questo è molto più difficile se si desidera evitare molto più di un singolo carattere prima di y
. Quindi dovresti fare qualcosa del tipo:
"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"]
Purtroppo Ruby non supporta lookbehind negativo, quindi avrai problemi se devi cercare più di un singolo personaggio. Per un solo personaggio, puoi occupartene catturando la partita:
/[^x](y)/
In PCRE, si utilizza un aspetto negativo:
(:<!x)y
Non sono sicuro che sia supportato da Ruby, ma puoi sempre cercare.
Può essere fatto con uno sguardo negativo dietro, (?<!x)y