Pregunta

Usando Ruby, ¿cómo puedo usar una única expresión regular para hacer coincidir todas las apariciones de 'y' en " xy y ay xy + y " que NO están precedidos por x (y, ay, + y)?
/ [^ x] y / coincide con el carácter anterior también, así que necesito una alternativa ...

¿Fue útil?

Solución

Necesita una aserción negativa de ancho cero. Pruebe /(?<!x)y/ que dice exactamente lo que está buscando, es decir, encuentre todas las 'y' no precedidas por 'x', pero no incluye el carácter anterior, que es la parte de ancho cero.

Editado para agregar: Aparentemente, esto solo es compatible con Ruby 1.9 y versiones posteriores.

Otros consejos

La observación negativa no es compatible hasta Ruby 1.9, pero puede hacer algo similar con el escaneo:

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

Por supuesto, esto es mucho más difícil si desea evitar mucho más que un solo carácter antes de y. Entonces tendrías que hacer algo como:

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

Ruby desafortunadamente no es compatible con la mirada hacia atrás negativa, por lo que tendrás problemas si necesitas buscar más de un personaje. Para un solo personaje, puedes ocuparte de esto capturando la partida:

/[^x](y)/

En PCRE, utiliza un retrospectivo negativo:

(:<!x)y

No estoy seguro si Ruby lo admite, pero siempre puedes buscarlo.

Se puede hacer con una mirada negativa hacia atrás, (?<!x)y

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top