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.
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.
Esto no es un aspecto muy agradable .. pero funciona:
t = "texto"
t [-1] == 47? t: t + "/"
47 es un código de barra invertida
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]' –
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.
¿Por qué quieres usar gsub?
sub
no gsub
.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
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
@darkliquid: Funciona en Ruby 1.9 . Actualizado mi respuesta, gracias. –
Otra ruta hacia la compatibilidad 1.8 es la ruta << '/' a menos que la ruta [-1 ..- 1] == '/'. –
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
"/var/www".gsub(/[^\/]$/, '\1/') #=> "/var/www/"
"/var/www/".gsub(/[^\/]$/, '\1/') #=> "/var/www/"
"example.com" .gsub (/ [^ \ /] $ /, '\ 1 /') # => "example.co/" – troynt
Aquí es un poco más fácil de leer la versión
path << '/' unless path.end_with?('/')
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.
Funcionalmente genial, pero no creo que pueda poner eso en mi código sin agregar un comentario. –
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
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 –
También vale la pena aprender sobre la librería '' pathname'' que implementa un álgebra completa para trabajar con nombres de rutas. –