Usando Ruby, ¿cómo puedo usar una sola expresión regular para hacer coincidir todas las apariciones de 'y' en "xy y ay xy + y" que NO van precedidas de x (y, ay, + y)?
/[^ x] y/detecta el carácter anterior también, así que necesito una alternativa ...regexp para que coincida con string1 a menos que esté precedido por string2
Respuesta
Necesita una aserción de observación negativa de ancho cero. Intente /(?<!x)y/
, que dice exactamente lo que está buscando, es decir, encuentre toda 'y' no precedida 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 posteriores.
En PCRE, se utiliza un vistazo detrás negativo:
(:<!x)y
No estoy seguro si esto es respaldado por Ruby, pero siempre puedes mirar hacia arriba.
Se puede hacer con un aspecto negativo detrás, (?<!x)y
Rubí, lamentablemente no es compatible con búsqueda hacia atrás negativo, por lo que tendrá problemas si necesita buscar más de un solo carácter. Para un solo carácter, que puede hacerse cargo de esta capturando el partido:
/[^x](y)/
Ah, no soy un experto en Ruby - jbourque dice que el lookbehind negativo está en Ruby más nuevo. Ahí está tu verdadera respuesta. – Cascabel
[^ x] debe coincidir con un carácter. si y ocurre al comienzo de la línea, debemos hacer coincidirlo:/(?: \ A |^| [^ x]) y / –
negativo mirada detrás no se admite hasta Ruby 1.9, pero se puede hacer algo similar con la exploración:
"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 del y
. Entonces habría 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"]
- 1. ¿Es mejor String.Equals (string1.Substring (0, x), string2) que string1.StartsWith (string2)?
- 2. Div. Vim a menos que esté abierto
- 3. Regex para que coincida con cualquier carácter que no sea palabra, pero menos
- 4. MySQL REGEXP para números que comienzan con
- 5. ¿Cómo dividir la cadena por ',' a menos que ',' esté entre paréntesis usando Regex?
- 6. Regex para que coincida con palabras completas que comienzan con $
- 7. Regex para que coincida con Domain.CCTLD
- 8. En Ruby, ¿por qué `foo = true a menos que esté definido? (Foo)` hacer la tarea?
- 9. expresiones regulares para que coincida con EOF
- 10. expresión regular para que coincida con todo, excepto las palabras dadas (que puede incluir guiones/guiones)
- 11. Regex: coincide con toda la cadena a menos que
- 12. string1> = string2 no implementado en Linq to SQL, any workarround?
- 13. Regex para que coincida con los valores que no están rodeados por otro char?
- 14. Rubí Expresión regular para que coincida con una dirección URL
- 15. ¿Cómo forzar a PHP a que emita un número precedido por ceros?
- 16. Regexp que coincide con las expresiones regulares válidas
- 17. Regex para que coincida con una palabra con signos + (más)
- 18. Diferencia - a menos que/si
- 19. Expresión regular para que coincida con carácter repitió tres veces
- 20. Regex para que coincida con tres palabras separadas por comas dos
- 21. La cámara está equivocada a menos que el teclado esté abierto
- 22. javascript expresión regular para que no coincida con una palabra
- 23. PHP expresión regular para que coincida con un div
- 24. Rastreador de errores distribuidos para que coincida con DVC
- 25. Expresión regular para que coincida con el archivo # include C
- 26. búsqueda de php (difusa) que coincida con
- 27. "ansioso" expresión regular que coincida con
- 28. Regex para que coincida con una dirección IP
- 29. C#. Regex más rápida para que coincida con cualquier cadena
- 30. Expresión regular para que no coincida con "www"
que iba a sugerir una búsqueda hacia atrás negativo, pero parece que está fuera de suerte en ese aspecto: http://www.regular-expressions.info /lookaround.html#limitbehind. * "Finalmente, los sabores como JavaScript, Ruby y Tcl no son compatibles con lookbehind en absoluto, a pesar de que admiten el lookahead." * –
Vea también http://stackoverflow.com/questions/530441/how-would-you-use- a-regular-expresión-a-ignorar-cadenas-que-contiene-un-específico – finnw
Si las aserciones de mirada hacia atrás no son compatibles, podríamos usar esto: '([^ x] y") | (^ y ")' . 'y' puede aparecer al comienzo de la cadena y ese caso no está cubierto por '/ [^ x] y /'. – approxiblue