Wyrażenie regularne JavaScript: usuń pierwszy i ostatni ukośnik

83

Mam te ciągi w javascript:

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

i chciałbym usunąć pierwszy i ostatni ukośnik, jeśli istnieje.

Próbowałem, ^\/(.+)\/?$ale to nie działa.

Czytając jakiś post w stackoverflow stwierdziłem, że php ma funkcję przycinania i mógłbym użyć jego tłumaczenia javascript ( http://phpjs.org/functions/trim : 566), ale wolałbym „proste” wyrażenie regularne.

CorPao
źródło

Odpowiedzi:

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

„Zastąp wszystkie ( /.../g) wiodące ukośniki ( ^\/) lub ( |) końcowe ukośniki ( \/$) pustym ciągiem”.

kennytm
źródło
19
Zmodyfikowałem to, aby usunąć dowolną liczbę początkowych lub końcowych ukośników, używając „+”: replace (/ ^ \ / + | \ / + $ / g, '')
rickumali
A jeśli sznurek jest //www.google.com? //zostanie pominięty.
Isaac Ferreira,
@IsaacFerreira, możesz użyć tego /^\s*\/*\s*|\s*\/*\s*$/gm, zajmuje się możliwymi białymi znakami przed i po ukośnikach i wielu ukośnikach, dodając *
benraay
36

Nie ma prawdziwego powodu, aby używać tutaj wyrażenia regularnego, funkcje tekstowe będą działać dobrze:

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"

Zobacz to w akcji na jsFiddle .

Bibliografia:

Daniel Vandersluis
źródło
3
Myślę, że czasami unikanie wyrażenia regularnego pomoże zwiększyć czytelność, ale w tym przypadku użycie 1 wiersza wyrażenia regularnego i 1 wiersza komentarza w rzeczywistości będzie działać w znacznie bardziej elegancki sposób.
kroe
3
Nie usunie to zduplikowanych ukośników na początku lub na końcu ciągu ("// banking / bon / ita //"), co spowoduje, że wyrażenie regularne, takie jak replace (/ ^ \ / + | \ / + $ / g, '') .
diamondsea
Myślę, że nie pomaga to nawet zwiększyć czytelności, po prostu staje się testem stopnia, w jakim ktoś może zrozumieć regex, czy nie. Myślę, że większość ludzi może powiedzieć, co robi / ^ \ / | \ / $ / g po kilku sekundach, szczególnie w kontekście innego kodu innego niż wyrażenia regularne. Więc w tym przypadku wyrażenie regularne jest lepsze IMO.
William
7

W przypadku, gdy użycie RegExp nie jest opcją lub musisz obsługiwać przypadki narożne podczas pracy z adresami URL (takimi jak podwójne / potrójne ukośniki lub puste wiersze bez skomplikowanych zamienników) lub wykorzystując dodatkowe przetwarzanie, oto mniej oczywiste, ale bardziej funkcjonalne- stylowe rozwiązanie:

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

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

console.log(trimmedUrls);

W tym fragmencie filter()funkcja może zaimplementować bardziej złożoną logikę niż tylko filtrowanie pustych ciągów (co jest zachowaniem domyślnym).

Słowo ostrzeżenia - to nie jest tak szybkie, jak inne fragmenty tutaj.

Uszkodzone organiczne
źródło
3

Na wszelki wypadek, gdyby ktoś potrzebował tu przedwczesnej optymalizacji ...

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
źródło
@benraay, czy potrzebujesz pomocy w zrozumieniu tego?
Milen Georgiev
@MilenGeorgiev nie, dziękuję Właśnie mówiłem, że ta wersja kodu jest mniej czytelna niż ta z RegEx, którą czasami trudno zrozumieć, ale theString.replace(/^\/|\/$/g, '')jest naprawdę prosta i łatwa do zrozumienia dla osób czytających kod, ale prawdopodobnie wolniejsza niż ta!
benraay