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 
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 
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 
Gracias.