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 ...

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top