Javascript regulärer Ausdruck: Entfernen Sie den ersten und letzten Schrägstrich

81

Ich habe diese Zeichenfolgen in Javascript:

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

und ich möchte den ersten und letzten Schrägstrich entfernen, wenn er existiert.

Ich habe es versucht, ^\/(.+)\/?$aber es funktioniert nicht.

Beim Lesen eines Beitrags in stackoverflow stellte ich fest, dass PHP eine Trimmfunktion hat und ich seine Javascript-Übersetzung ( http://phpjs.org/functions/trim : 566) verwenden könnte, aber ich würde einen "einfachen" regulären Ausdruck bevorzugen.

CorPao
quelle

Antworten:

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

"Ersetzen Sie alle ( /.../g) führenden Schrägstriche ( ^\/) oder ( |) nachfolgenden Schrägstriche ( \/$) durch eine leere Zeichenfolge."

kennytm
quelle
19
Ich habe dies geändert, um eine beliebige Anzahl von führenden oder nachfolgenden Schrägstrichen zu entfernen, indem ich "+" verwendet habe: replace (/ ^ \ / + | \ / + $ / g, '')
rickumali
Was ist, wenn die Zeichenfolge ist //www.google.com? //wird vermisst werden.
Isaac Ferreira
@IsaacFerreira Sie können dieses verwenden, /^\s*\/*\s*|\s*\/*\s*$/gmes kümmert sich um einige mögliche Leerzeichen vor und nach den Schrägstrichen und mehreren Schrägstrichen, die das *
benraay
36

Es gibt keinen wirklichen Grund, hier einen regulären Ausdruck zu verwenden. Zeichenfolgenfunktionen funktionieren einwandfrei:

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"

Sehen Sie dies in Aktion auf jsFiddle .

Verweise:

Daniel Vandersluis
quelle
3
Ich denke, manchmal hilft das Vermeiden von Regexp bei der Lesbarkeit, aber in diesem Fall wird die Verwendung von 1 Zeile Regexp und 1 Zeile Kommentar den Job tatsächlich viel eleganter machen.
Kroe
3
Dadurch werden keine doppelten Schrägstriche am Anfang oder Ende der Zeichenfolge ("// bank / bon / ita //") entfernt, die ein Regex wie replace (/ ^ \ / + | \ / + $ / g, '') verwendet .
Diamondsea
Ich denke nicht, dass es sogar dazu beiträgt, die Lesbarkeit zu verbessern, es wird nur ein Test dafür, inwieweit jemand Regex verstehen kann oder nicht. Ich denke, die meisten Leute können nach ein paar Sekunden erkennen, was / ^ \ / | \ / $ / g tut, insbesondere im Zusammenhang mit anderem Nicht-Regex-Code. In diesem Fall ist der Regex IMO besser.
William
7

Falls die Verwendung von RegExp keine Option ist oder Sie Eckfälle behandeln müssen, während Sie mit URLs arbeiten (z. B. doppelte / dreifache Schrägstriche oder leere Zeilen ohne komplexe Ersetzungen) oder zusätzliche Verarbeitung verwenden, ist dies weniger offensichtlich, aber funktionaler. Stillösung:

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

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

console.log(trimmedUrls);

In dieser Snippet- filter()Funktion kann eine komplexere Logik implementiert werden, als nur leere Zeichenfolgen zu filtern (dies ist das Standardverhalten).

Ein Wort der Warnung - dies ist nicht so schnell wie andere Schnipsel hier.

Beschädigtes Bio
quelle
3

Nur für den Fall, dass hier jemand eine vorzeitige Optimierung benötigt ...

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
quelle
@benraay brauchst du Hilfe, um es zu verstehen?
Milen Georgiev
@MilenGeorgiev nein danke ich habe nur gesagt, diese Version des Codes ist weniger lesbar als die mit RegEx. Sie sind manchmal schwer zu verstehen, aber theString.replace(/^\/|\/$/g, '')für Leute, die den Code lesen, wirklich einfach und leicht zu verstehen, aber wahrscheinlich langsamer als diese!
Benraay