Matchear varios Regexp secuencialmente

Hola, no consigo disponer de unas cuantas expresiones regulares y
comparar un texto con ellas.

El texto sería por ejemplo:

texto = “INVITE sip:[email protected] SIP/2.0”

Y necesito, para que sean reusables, tener las expresiones regulares
separadas:

METHOD = “(INVITE|ACK|BYE|CANCEL)” # Uno de esos métodos.
URI = “[0-9a-z]@[-9a-z]*”
SIP_VERSION = “SIP/[0-9].[0-9]”

Y ahora quiero hacer esto:

if texto =~ /^METHOD\sURI\sSIP_VERSION/

Pero sencillamente no funciona en absoluto, parece que al meter un
String dentro de / / no lo admite como expresión regular sino que
busca dicha cadena literalmente.

Así que pruebo con:
METHOD = Regexp.new("(INVITE|ACK|BYE|CANCEL)" )
URI = Regexp.new("[0-9a-z]@[-9a-z]*")
SIP_VERSION = Regexp.new(“SIP/[0-9].[0-9]”)

Pero con esto no puedo comprobar una línea y que encuentre expresiones
regulares secuencialmente y que sólo devuelva !nil si se cumple todo.

Empiezo a pensar que esto no se puede hacer y que tengo que hacer como
he hecho hasta ahora: separar cada término del texto con un “split” y
compararlo con su expresión regular correspondiente, ¿es así?

Muchas gracias.

2008/3/12 Iñaki Baz C. [email protected]:

URI = “[0-9a-z]@[-9a-z]*”
Así que pruebo con:
Muchas gracias.


Iñaki Baz C.
[email protected]


Ror-es mailing list
[email protected]
simplelogica.net

Puedes hacerlo
así:
METHOD = “(INVITE|ACK|BYE|CANCEL)” # Uno de esos métodos.
URI = “[0-9a-z]@[-9a-z]"
SIP_VERSION = “SIP/[0-9].[0-9]”
if texto =~ Regexp.new("^#{METHOD}\s
#{URI}\s*#{SIP_VERSION}”)

Suerte.

Yo te recomendaria tener la expresion regular en un solo objeto.

Si necesitas reutilizar, arma un objeto regexp agregando otros regexps.
para que al final solo hagas el =~ /contra_una_sola_entidad/

Lo mismo que hacemos con los metodos.

Daniel escribió:

if texto =~ Regexp.new("^#{METHOD}\s*#{URI}\s*#{SIP_VERSION}")

Sí, en otro correo justo acabo de comentar que encontré esa solución:
if texto =~ /#{METHOD}\s*#{URI}\s*#{SIP_VERSION}/

Rodrigo escribió:

Yo te recomendaria tener la expresion regular en un solo objeto.

Si necesitas reutilizar, arma un objeto regexp agregando otros regexps.

Pero no hay forma de agregar un regexp a otro. Está el método de clase
“union”, pero es de clase y no de objeto.