¿La expresión regular de Ruby tiene un operador que no coincide como “! ~” En Perl?

92

Solo quiero saber si ruby ​​regex tiene un operador no coincidente como !~en perl. Siento que es inconveniente de usar (?!xxx)o (?<!xxxx)porque no puede usar patrones de expresiones regulares en la xxxparte.

usuario1793091
fuente
8
Todo lo que tenías que hacer era encenderlo irby probarlo. Probablemente hubiera sido más rápido que publicar una pregunta SO.
Mark Thomas
33
Pero no más rápido que buscar en Google 'ruby not match' y encontrar esta respuesta en SO;)
micapam
3
Experimenté por un tiempo antes de quedarme atascado, buscar en Google y encontrar esta respuesta (que funcionó). Nunca vuelvas a criticar a alguien por hacer una pregunta.
Jonathon Nordquist
2
Lo expresó de manera subóptima. Lo que creo que quiso decir fue, "recuerda que puedes encenderlo irby probarlo. Probablemente más rápido, incluso, que publicar una pregunta SO, y una gran oportunidad para probar las cosas en general". De todos modos, así es como lo escuché.
user2066657

Respuestas:

156

Sí: !~funciona bien; probablemente pensaste que no lo haría porque falta en la página de documentación deRegexp . Sin embargo, funciona:

irb(main):001:0> 'x' !~ /x/
=> false
irb(main):002:0> 'x' !~ /y/
=> true
Konrad Rudolph
fuente
8
!~se documenta en Objeto .
Tonči D.
3
Con ruby ​​2.4, también existe una sintaxis algo más agradable RegExp#match?, que puede negar fácilmente. Según las notas de la versión , hace incluso menos asignaciones que!~
panmari
6

AFAIK (?! Xxx) es compatible:

2.1.5 :021 > 'abc1234' =~ /^abc/
 => 0
2.1.5 :022 > 'def1234' =~ /^abc/
 => nil
2.1.5 :023 > 'abc1234' =~ /^(?!abc)/
 => nil
2.1.5 :024 > 'def1234' =~ /^(?!abc)/
 => 0
becerro
fuente
Es una solución de nivel inferior. No siempre es fácil convertir expresiones regulares de esta manera. Por otro lado, esta solución no depende del lenguaje de programación de nivel superior;)
Konstantin
0

De vuelta en perl, 'foobar' !~ /bar/fue perfecto para probar que la cadena no contiene "barra".

En Ruby, particularmente con una guía de estilo moderna, creo que una solución más explícita es más convencional y fácil de entender:

input = 'foobar'

do_something unless input.match?(/bar/) 

needs_bar = !input.match?(/bar/)

Dicho esto, creo que sería genial si hubiera un .no_match?método.

David Hempy
fuente