2009-12-04 33 views
22

Versión corta - ¿Cómo hago Python rsplit() en ruby?Ruby: división de cadena en el carácter, contando desde el lado derecho

Versión más larga - Si quiero dividir una cadena en dos partes (nombre, sufijo) en el primer '.' carácter, esto hace el trabajo muy bien:

name, suffix = name.split('.', 2) 

Pero si desea dividir en la última (más a la derecha) '' carácter, que no han sido capaces de llegar a nada más elegante que esto:

idx = name.rindex('.') 
name, suffix = name[0..idx-1], name[idx+1..-1] if idx 

Tenga en cuenta que la cadena del nombre original puede no tiene un punto en absoluto, en cuyo caso el nombre debe estar intacto y el sufijo debe ser nulo; también puede tener más de un punto, en cuyo caso solo el bit posterior al final debe ser el sufijo.

Respuesta

41

String#rpartition hace precisamente eso:

name, match, suffix = name.rpartition('.') 

Fue introducido en Ruby 1.8.7, por lo que si ejecuta una versión anterior se puede utilizar para require 'backports/1.8.7/string/rpartition' eso para trabajar

+1

Gracias! String # rpartition también está presente en Ruby 1.8.7. – alberge

+0

@alberge: Efectivamente, arreglé mi respuesta. ¡Gracias! –

0

si esto = "what.to.do" se puede hacer esto:

this.split(%r{(.+)\.}) 

y podrá volver

["", "what.to", "do"] 
+0

El elemento vacío es un poco molesto, y no se puede pegar [1..2] al final para arreglarlo, ya que "whattodo" .split (% r {(. +) \.}) Regresa ["qué hacer"]. – jpatokal

0

Si quieres la versión literal de rsplit, puede hacer esto (esto es en parte una broma, pero en realidad funciona bien):

"what.to.do".reverse.split('.', 2).map(&:reverse).reverse 
=> ["what.to", "do"] 
+0

¡genial! pero puedo hacer esto. dividir (% r {(. +) \.}) [1,2] que da el resultado – ennuikiller

+0

de sme. De hecho, hay muchas maneras. – Peter

2

esto es lo que realmente haría:

/(.*)\.(.*)/.match("what.to.do")[1..2] 
=> ["what.to", "do"] 

o tal vez de manera más convencional,

s = "what.to.do" 

s.match(/(.*)\.(.*)/)[1..2] 
=> ["what.to", "do"] 
+1

Estoy de acuerdo, pero supuse que quería una solución con división :) – ennuikiller

+0

De lo contrario agradable, pero falla cuando s no contiene un punto. – jpatokal

5

poner sobre la gorra para pensar por un tiempo y se le ocurrió esta expresión regular:

"what.to.do.now".split(/\.([^.]*)$/) 
=> ["what.to.do", "now"] 

O en términos humanos "división en punto, no seguido por otro punto, al final de la cadena ". También funciona muy bien con las cadenas sin punto y secuencias de puntos:

"whattodonow".split(/\.([^.]*)$/) 
=> ["whattodonow"] 
"what.to.do...now".split(/\.([^.]*)$/) 
=> ["what.to.do..", "now"] 
Cuestiones relacionadas