2012-06-18 8 views
24

Tengo una cadena que le gustaría todo después de la última / que se devuelva.¿Cómo se puede devolver todo después de la última barra (/) en una cadena de Ruby

E.g. para https://www.example.org/hackerbob, debe devolver "hackerbob".

+1

que sería mucho más útil si se pudiera explicar cómo encontrar "hackerbob" (por ejemplo, dar otros ejemplos de direcciones URL que necesita analizar), como es, simplemente puede hacer ''https://www.facebook.com/hackerbob' [/ hackerbob /]' Pero eso es presumiblemente no lo que quiere. ¿Son todas tus URL solo nombres de usuario de Facebook? ¿Y si fuera como 'www.whatever.com/users/hackerbob', ¿todavía quieres hackerbob o 'users/hackerbob'? Esta pregunta es demasiado ambigua. –

+1

@JoshuaCheek: del título diría que OP quiere coincidir con la parte de la URL después de la última barra inclinada. –

+0

Debería ser todo después de la última barra inclinada. – Hendrik

Respuesta

61

No creo que una expresión regular es una buena idea, viendo cómo la tarea es simple:

irb(main):001:0> s = 'https://www.facebook.com/hackerbob' 
=> "https://www.facebook.com/hackerbob" 
irb(main):002:0> s.split('/')[-1] 
=> "hackerbob" 

Por supuesto, también podría hacerlo usando expresiones regulares, pero es mucho menos legible:

irb(main):003:0> s[/([^\/]+)$/] 
=> "hackerbob" 
+3

+1 por no usar un martillo para conducir los tornillos. –

+0

gracias. la idea dividida también es buena. – Hendrik

+0

También podría usar [String # rpartition] (http://ruby-doc.org/core-2.2.3/String.html#method-i-rpartition) – Cisuuable

0

Claro que puedes:

string = 'https://www.facebook.com/hackerbob' 
string =~ /^https?:\/\/www\.facebook\.com\/(.*)/ 
$1 
0

pueden utilizar este

subject = /(\/)([^\/]+)\Z/i.match(subject) 
if match 
    # match start: match.begin(0) 
    # match end (exclusive): match.end(0) 
    # matched text: match[0] 
    # backreference n start: match.begin(n) 
    # backreference n end (exclusive): match.end(n) 
    # backreference n text: match[n] 
else 
    # Match attempt failed 
end 
0

utilizarlo

1.9.3p194 :039 > line = 'https://www.facebook.com/hackerbob' 
1.9.3p194 :039 > line.match(/.com\/(\w+$)/)[1] # => "hackerbob" 
+0

La parte '.com \ /' de la expresión regular es innecesaria ... '/ (\ w + $) /' debería ser suficiente. –

2

una muestra más

str = 'https://www.facebook.com/hackerbob' 
ending = str.match(/.com\/(.*)/) 
p ending[1] 
0

Puede probar/[a-zA-Z] +: // [az] +. [az] +. [az] +/(. +)/si lo está utilizando para la cadena anterior o cualquier otra url similar. Una gran herramienta a utilizar para la expresión regular es http://www.rubular.com

8

Utilice la herramienta correcta para el trabajo:

require 'uri' 
url = "https://www.facebook.com/hackerbob" 
URI.parse(url).path[1..-1] # => "hackerbob" 
+3

Creo que esto no responde la pregunta para URL como 'example.org/user/hackerbob' (que debería dar como resultado' hackerbob'). Para responder la pregunta, tendríamos que hacer 'URI.parse (url) .path.split ('/') [- 1]' o algo así, lo que no tiene ninguna ventaja real sobre simplemente dividir la cadena en el primer lugar –

Cuestiones relacionadas