Una de "sub" o "split"

Hola, me he atascado un poco en una cosa que debería ser relativamente
fácil. Tengo esta cadena:

cadena = “Contact: sip:[email protected]:5061;nat=yes”

y quiero quedarme sólo con:

“sip:[email protected]:5061;nat=yes”

Bien, lo he conseguido así, pero no me convence:

cadena.split(":")[1…-1].join(":").strip

No me gusta tener que andar convirtiendo a un array y demás pascuas,
lo veo un poco bastante absurdo. He probado con “gsub” o “sub” pero no
me funciona:

cadena.sub(/^.*:/,"")
=> “5061;nat=yes”

Como veis busca hasta la última aparición de “:” y yo quiero que pare
a la primera. Entiendo que gsub haga eso, pero no me lo esperaba de
“sub”.

¿Alguna sugerencia? Gracias.

Iñaki Baz C. escribió:

cadena.split(":")[1…-1].join(":").strip

No me gusta tener que andar convirtiendo a un array y demás pascuas,
lo veo un poco bastante absurdo. He probado con “gsub” o “sub” pero no
me funciona:

cadena.sub(/^.*:/,"")
=> “5061;nat=yes”

Prueba con:
cadena.sub(/^.*:\s/,"")

Como veis busca hasta la última aparición de “:” y yo quiero que pare
a la primera. Entiendo que gsub haga eso, pero no me lo esperaba de
“sub”.

¿Alguna sugerencia? Gracias.

dnd

On Mar 11, 2008, at 17:40 , Iñaki Baz C. wrote:

Bien, lo he conseguido así, pero no me convence:

cadena.split(":")[1…-1].join(":").strip

Una alternativa ahi es poner un limite a split para que devuelva a lo
sumo dos elementos, por ejemplo:

cadena.split(":", 2).last.strip
=> "sip:[email protected]:5061;nat=yes"

cadena.sub(/^.*:/,"")
=> “5061;nat=yes”

Como veis busca hasta la última aparición de “:” y yo quiero que pare
a la primera. Entiendo que gsub haga eso, pero no me lo esperaba de
“sub”.

Aqui las soluciones son o bien añadir “?” al cuantificador:

/.*?:/

o casi mejor directamente asertar que quieres desplazarte a la derecha
en la medida en que no haya ":"s:

/[^:]*:/

Como los matchings van de izquierda a derecha no hace falta asertar
principio de cadena.

– fxn

Iñaki Baz C. wrote:

También funciona, aunque reconozco que nunca he entendido qué
significa poner algo como:
.*?
(también lo he visto trabajando con “sed” en Bash y nunca he tenido
claro cómo funciona).

.?: significa algo como “cualquier caracter antes del ‘:’ sin ser
ambicioso”, digamos que el ‘?’ limita al '

Gracias, veo que nunca sabré lo suficiente de expresiones regulares :wink:

Yo tampoco sé lo suficiente de expresiones regulares, pero se trata de
ir aprendiendo jeje, y te recomiendo este tutorial que está bastante
completo y bueno. Es de perl pero las regex son muy similares con ruby:
http://perldoc.perl.org/perlretut.html

Esta es una forma que quiza te sirva para conocer el poder de los grupos
en las expresiones regulares. Desde mi punto de vista muy utiles.

cadena = “Contact: sip:[email protected]:5061;nat=yes”
cadena =~ /Contact: (.+)/
p $1

Las expresiones regulares son tus amigas.

-r.

2008/3/11, Xavier N. [email protected]:

Una alternativa ahi es poner un limite a split para que devuelva a lo
sumo dos elementos, por ejemplo:

cadena.split(":", 2).last.strip
=> "sip:[email protected]:5061;nat=yes"

Qué brutal, no lo conocía !!

Aqui las soluciones son o bien añadir “?” al cuantificador:

/.*?:/

También funciona, aunque reconozco que nunca he entendido qué
significa poner algo como:
.*?
(también lo he visto trabajando con “sed” en Bash y nunca he tenido
claro cómo funciona).

o casi mejor directamente asertar que quieres desplazarte a la derecha
en la medida en que no haya ":"s:

/[^:]*:/

Como los matchings van de izquierda a derecha no hace falta asertar
principio de cadena.

Gracias, veo que nunca sabré lo suficiente de expresiones regulares :wink:

El Martes, 11 de Marzo de 2008, Rodrigo B.
escribió:> Esta es una forma que quiza te sirva para conocer el poder de los grupos

en las expresiones regulares. Desde mi punto de vista muy utiles.

cadena = “Contact: sip:[email protected]:5061;nat=yes”
cadena =~ /Contact: (.+)/
p $1

Cierto, muy potente, los había usado alguna vez con “sed” pero nunca le
había
sacado todo el potencial :wink:

Gracias.