Expresión regular de JavaScript: eliminar la primera y la última barra

83

Tengo estas cadenas en javascript:

/banking/bonifici/italia
/banking/bonifici/italia/

y me gustaría eliminar la primera y la última barra si existe.

Lo intenté ^\/(.+)\/?$pero no funciona.

Al leer alguna publicación en stackoverflow, encontré que php tiene la función de recorte y podría usar su traducción de JavaScript ( http://phpjs.org/functions/trim : 566) pero preferiría una expresión regular "simple".

CorPao
fuente

Respuestas:

194
return theString.replace(/^\/|\/$/g, '');

"Reemplace todas las ( /.../g) barra inclinada ( ^\/) o ( |) barra inclinada ( \/$) con una cadena vacía".

Kennytm
fuente
19
Modifiqué esto para eliminar cualquier número de barras inclinadas iniciales o finales, usando "+": replace (/ ^ \ / + | \ / + $ / g, '')
rickumali
¿Y si la cuerda es //www.google.com? //Será extrañado.
Isaac Ferreira
@IsaacFerreira, puede usar este /^\s*\/*\s*|\s*\/*\s*$/gm, se ocupa de algunos posibles espacios en blanco antes y después de las barras y barras múltiples agregando el *
benraay
36

No hay una razón real para usar una expresión regular aquí, las funciones de cadena funcionarán bien:

var string = "/banking/bonifici/italia/";
if (string.charAt(0) == "/") string = string.substr(1);
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1);
// string => "banking/bonifici/italia"

Vea esto en acción en jsFiddle .

Referencias:

Daniel Vandersluis
fuente
3
Creo que a veces evitar las expresiones regulares ayudará a mejorar la legibilidad, pero en este caso, usar 1 línea de expresión regular y 1 línea de comentario en realidad hará el trabajo de una manera mucho más elegante.
kroe
3
Esto no eliminará las barras duplicadas al principio o al final de la cadena ("// banca / bon / ita //") que una expresión regular como replace (/ ^ \ / + | \ / + $ / g, '') .
Diamondsea
No creo que ayude a aumentar la legibilidad, simplemente se convierte en una prueba de hasta qué punto alguien puede comprender expresiones regulares o no. Creo que la mayoría de la gente puede saber qué hace / ^ \ / | \ / $ / g después de unos segundos, especialmente en el contexto de otro código que no sea de expresiones regulares. Entonces, en este caso, la expresión regular es mejor en mi opinión.
William
7

En caso de que usar RegExp no sea una opción , o si tiene que manejar casos de esquina mientras trabaja con URL (como barras diagonales dobles / triples o líneas vacías sin reemplazos complejos), o si utiliza un procesamiento adicional, aquí hay una menos obvia, pero más funcional: solución de estilo:

const urls = [
  '//some/link///to/the/resource/',
  '/root',
  '/something/else',
];

const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/'));

console.log(trimmedUrls);

En este fragmento, la filter()función puede implementar una lógica más compleja que simplemente filtrar cadenas vacías (que es el comportamiento predeterminado).

Una advertencia: esto no es tan rápido como otros fragmentos aquí.

Orgánico dañado
fuente
3

En caso de que alguien necesite una optimización prematura aquí ...

http://jsperf.com/remove-leading-and-trailing-slashes/5

var path = '///foo/is/not/equal/to/bar///'
var count = path.length - 1
var index = 0

while (path.charCodeAt(index) === 47 && ++index);
while (path.charCodeAt(count) === 47 && --count);

path = path.slice(index, count + 1)
yckart
fuente
@benraay, ¿necesitas ayuda para entenderlo?
Milen Georgiev
@MilenGeorgiev no, gracias. Solo decía que esta versión del código es menos legible que la que tiene RegEx. A veces son difíciles de entender, pero theString.replace(/^\/|\/$/g, '')es realmente simple y fácil de entender para las personas que leen el código, ¡pero probablemente más lento que esta!
benraay