2011-05-11 13 views
8

¿Cómo dividir la cadena de la segunda ocurrencia del carácterSeparar una cadena de la segunda ocurrencia del carácter

str = "20050451100_9253629709-2-2" 

I need the output 
["20110504151100_9253629709-2", "2"] 
+1

En función de su respuesta aceptada, parece que usted está dispuesto a conformarse con la división en el guión final, no lo estrictamente la segunda. Debe asegurarse de que en sus datos, el 2 sea siempre el final. – Kelvin

Respuesta

4

Usted podría utilizar la detección de expresiones regulares:

str = "20050451100_9253629709-2-2" 
m = str.match /(.+)-(\d+)/ 
[m[1], m[2]] # => ["20050451100_9253629709-2", "2"] 

El r expresión egular coincide con "cualquier cosa" seguido de un guión seguido de dígitos numéricos.

+0

gracias @hallidave. Creo que este es el mejor rendimiento en cuanto a rendimiento. –

+0

Esta respuesta es bastante antigua, pero ¿podría alguien describir o vincular la sintaxis de la coincidencia de cadenas? –

4

Si siempre tiene dos guiones se puede obtener el último índice del -:

str = "20050451100_9253629709-2-2" 
last_index = str.rindex('-') 

# initialize the array to hold the two strings 
arr = [] 

# get the string characters from the beginning up to the hyphen 
arr[0] = str[0..last_index] 
# get the string characters after the hyphen to the end of the string 
arr[1] = str[last_index+1..str.length] 
3
"20050451100_9253629709-2-2"[/^([^-]*\-[^-]*)\-(.*)$/] 
[$1, $2] # => ["20050451100_9253629709-2", "2"] 

que coincidirá con cualquier cadena, partiéndolo por la segunda aparición de -.

+0

+1 Éste realmente usa la segunda ocurrencia y no la final. Puede hacerlo aún más breve de esta manera: 'str.match (/^([^-]*\-[^-]*)\-(.*)$/). To_a [1 ..- 1]' – Kelvin

2

Se podría dividir aparte y unirse de nuevo juntos de nuevo:

str = "20050451100_9253629709-2-2" 
a = str.split('-') 
[a[0..1].join('-'), a[2..-1].join('-')] 
9

No hay nada como una sola línea :)

str.reverse.split('-', 2).collect(&:reverse).reverse 

Se invertirá la cadena, dividido por '-' una vez, devolviendo así 2 elementos (el material delante del primero '-' y todo lo que le sigue), antes de invertir ambos elementos y luego la matriz misma.

Editar

*before, after = str.split('-') 
puts [before.join('-'), after] 
+0

gracias @gnab. Aquí, estás haciendo un proceso muy largo ... Necesito acortar el proceso –

+1

De hecho, simplemente estaba tratando de evitar las expresiones regulares ilegibles, que en mi humilde opinión son un poco exageradas para este problema bastante simple. Actualicé mi respuesta con una alternativa de dos líneas. – gnab

+0

Para mí, la mejor respuesta entre todas las demás. – Aleks

Cuestiones relacionadas