2011-10-16 5 views
5

He simplificado los ejemplos. Digamos que tengo una cadena que contiene el código para una expresión regular. Me gustaría que la expresión regular para que coincida con un punto literal y por lo tanto yo quiero que sea:Ruby Regexp: diferencia entre new y union con una sola expresión regular

\. 

lo tanto, crear la siguiente cadena Ruby:

"\\." 

Sin embargo cuando lo uso con Regexp.union a crear mi expresión regular, me sale esto:

irb(main):017:0> Regexp.union("\\.") 
=> /\\\./ 

que coincidirá con una barra seguido de un punto, no sólo un único punto. Compare el resultado anterior con este:

irb(main):018:0> Regexp.new("\\.") 
=> /\./ 

que proporciona el Regexp que quiero pero sin la unión necesaria.

¿Podría explicar por qué Ruby actúa así y cómo hacer la unión correcta de expresiones regulares? El contexto de utilización es el de importar cadenas JSON que describen expresiones regulares y unirlas en Ruby.

Respuesta

5

Al pasar una cadena a Regexp.union está diseñado para que coincida con esa cadena literalmente. No hay necesidad de escapar, Regexp.escape ya se llama internamente.

Regexp.union(".") 
#=> /\./ 

Si desea pasar las expresiones regulares para Regexp.union, no utilice cadenas:

Regexp.union(Regexp.new("\\.")) 
#=> /\./ 
0

\\. es donde salió mal Creo que, si desea hacer coincidir un . que sólo debe utilizar la primera \. Ahora usted tiene una \ y \. y el primero que se escapó.

Para estar seguro sólo tiene que utilizar la expresión regular estándar proporcionado por Rubí que sería Regexp.new /\./ en su caso

Si desea utilizar la unión sólo tiene que utilizar Regexp.union "." que debe devolver /\./

De la clase de rubí de expresiones regulares:

Regexp.union("a+b*c")    #=> /a\+b\*c/ 
Cuestiones relacionadas