2010-08-13 13 views
5

Estoy intentando añadir barra final si es necesario:Cómo agregar una barra final si es necesario con gsub

a = '/var/www' 
a.gsub 
... 

no sé cómo hacerlo.

+6

I don' Creo que alguna vez he necesitado agregar una barra final en Ruby. ¿Conoces File.join? http://ruby-doc.org/core/classes/File.html#M002545 –

+1

También vale la pena aprender sobre la librería '' pathname'' que implementa un álgebra completa para trabajar con nombres de rutas. –

Respuesta

0

Esto no es un aspecto muy agradable .. pero funciona:

t = "texto"

t [-1] == 47? t: t + "/"

47 es un código de barra invertida

+0

Desea usar '? /' Que le dará el código de carácter (en Ruby 1.8) o una cadena de 1 caracteres (en Ruby 1.9) y siempre será compatible con 't [-1]' –

0

La siguiente secuencia de comandos muestra cómo se puede hacer esto:

a="/var/www"; 
print a + "\n"; 
a = a.gsub(/([^\/]$)/, '\1/'); 
print a + "\n"; 
a = a.gsub(/([^\/]$)/, '\1/'); 
print a + "\n"; 

Genera:

/var/www 
/var/www/ 
/var/www/ 

y funciona sustituyendo el último carácter de la línea (si no es un /) con el mismo carácter más unposteriortambién.

2

¿Por qué quieres usar gsub?

  1. no estás haciendo sustitución (nada se va a quitar de la cadena)
  2. Si usted está sustituyendo, y sólo necesita que se haga en un solo lugar, utilice sub no gsub.
  3. Si está sustituyendo y desea modificar la cadena, use sub! o gsub!.

Desde que no estás haciendo sustitución, simplemente añada la barra si es necesario:

path << '/' if path[-1] != '/' # Make sure path ends with a slash 

Actualización: para que sea compatible con versiones anteriores de Ruby (1.8.x), modificarlo ligeramente :

path << '/' if path[-1].chr != '/' # Make sure path ends with a slash 
+0

Eso no funcionará como [-1] devolverá el código de carácter, no el carácter, desea algo más como: a << '/' si a [-1] .chr! = '/' – darkliquid

+0

@darkliquid: Funciona en Ruby 1.9 . Actualizado mi respuesta, gracias. –

+0

Otra ruta hacia la compatibilidad 1.8 es la ruta << '/' a menos que la ruta [-1 ..- 1] == '/'. –

0

Hay un par de maneras diferentes que ya han sido cubiertas, a través de otro en la mezcla:

(a << '/').gsub!('//','/') 

o

(a << '/').squeeze('/') 

Vale la pena señalar sin embargo que, tanto de los que convertirá los casos de '//' a '/' en cualquier lugar de la cadena, aunque si sólo se trata de caminos, eso es poco probable para causar problemas

0
"/var/www".gsub(/[^\/]$/, '\1/') #=> "/var/www/" 
"/var/www/".gsub(/[^\/]$/, '\1/') #=> "/var/www/" 
+2

"example.com" .gsub (/ [^ \ /] $ /, '\ 1 /') # => "example.co/" – troynt

15

Aquí es un poco más fácil de leer la versión

path << '/' unless path.end_with?('/') 
18
a = File.join(a, "") 

Swift, simple, y tiene el efecto de garantizar que a termina en un separador de ruta; es decir, da el mismo resultado si a es "/var/www" o "/var/www/".

Esto es igual que el comentario de Joe White anterior; No sé por qué no lo envió como respuesta, ya que merece ser uno.

Curiosamente, la biblioteca Pathname no proporciona una forma conveniente de hacer lo mismo.

+3

Funcionalmente genial, pero no creo que pueda poner eso en mi código sin agregar un comentario. –

0

gsub Bastante simple, que es más fácil como un trazador de líneas de la concatenación (< <)

a = '/var/www' 
a.gsub('/?$', '/') 

Esto simplemente encuentra un carácter opcional / al final de la cadena y el representante

Cuestiones relacionadas