2009-10-17 19 views
15

Uso de Rubí ... Dada la siguiente secuencia:¿Cómo encontrar la última aparición de un número en una cadena usando Ruby?

x = "blah_blah.do.dah[4543]junk_junk" 

¿Cómo se quita todo el texto después del último número/dígitos?

Pensé que la manera más fácil de hacer esto podría ser encontrando el índice de última aparición y luego eliminando todo después de ese índice. Sin embargo, parece que no puedo entender cómo obtener ese índice. Todos mis intentos de usar Regex han fallado.

Respuesta

28

hay respuestas cómo hacer lo que necesita

también para encontrar la última ocurrencia del número:

x = 'blah_blah.do.dah[4543]junk_junk' 
x.rindex(/\d/) 
+0

Gracias. Por alguna razón que no funcionó, lo intenté ... Debo tener mi sintaxis ligeramente incorrrect. Combinar esto con gsub funcionó maravillosamente. – Chadwick

3

Ésta puede ser la expresión regular que está buscando:

s/\D*$// 

Esta expresión coincide con todos los no-dígitos al final de la cadena, empezando por el último dígito o el inicio de la cadena (si no contiene ningún dígito) y elimina lo que corresponda. Más precisamente, \D* es una coincidencia greedy para la mayor cantidad de dígitos posibles (cero o más). $ representa el final de la cadena.

En Rubí se puede utilizar el método de una cadena gsub para buscar y reemplazar el uso de una expresión regular:

x = 'blah_blah.do.dah[4543]junk_junk' 
y = x.gsub(/\D*$/, '') 

Para obtener más información sobre expresiones regulares y Ruby, ver regular-expressions.info.

+0

Probablemente solo quiera/\ D + $/(o/\ D + \ Z /) - OP deseaba despojar a los no dígitos del final. –

+0

@Glenn: doh, tienes razón ... Actualizaré la respuesta. – Stephan202

0

Asumo que desea incluir la última ']' después del número

Aquí está mi respuesta:

Original_Text = "blah_blah.do.dah[4543]junk_junk" 
Result___Text = Original_Text.gsub(Regexp.new("(.*\\[[0-9]+\\])[^0-9]*$"), '\1') 
puts Result___Text 

Si no, pruebe esto:

Original_Text = "blah_blah.do.dah[4543]junk_junk" 
Result___Text = Original_Text.gsub(Regexp.new("(.*[0-9]+)[^0-9]*$"), '\1') 
puts Result___Text 
+0

No use gorras. – yfeldblum

+0

Gorras? ¿Qué quieres decir? – NawaMan

+0

nombres de variables con un LeadingCapital se consideran constantes en Ruby. –

1

Esta expresión regular debe trabajo:

(.*(?=\d)\d)[^\d]*$ 

Debe utilizar algo como:

result = your_text.gsub(/(.*(?=\d)\d)[^\d]*$/, '\\1') 

Explicación:

  • (.*(?=\d)\d) es el grupo de cosas que desea guardar
    • .* la . es todo menos un salto de línea, los * medios 0 o más veces
    • (?=\d) significa hasta que pueda hacer coincidir a \d que es un dígito
    • \d significa que coinciden con ese dígito también!
  • [^\d]+$ es la parte que no desea guardar
    • en [^\d]* concuerda con algo que no coincide con \d y la * es nuevo 0 o más veces
    • la $ es el fin de la línea

Una alternativa podría ser simplemente reemplazando [^\d]+$ sin nada

0
irb(main):068:0> "blah_blah.do.dah[4543]junk_junk".match(/(.+\d)/)[1] 
=> "blah_blah.do.dah[4543" 
0
puts "blah_blah.do.dah[4543]junk_junk"[/.*\d+/] 
#returns "blah_blah.do.dah[4543" 

usando rindex:

x = "blah_blah.do.dah[4543]junk_junk" 
x.rindex(/\d/) 
puts "#{$`}#{$&}" 
#also returns "blah_blah.do.dah[4543" 
1

En general, esto parece ed para ser el más limpio & forma más sencilla de hacer lo que necesitaba. ¡Gracias a todos por señalarme en la dirección correcta!

index = file.rindex(/\d/) 
if(index) then 
    p file[0 , index+1] 
end 
Cuestiones relacionadas