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.


Antworten:


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

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


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:


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.


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)

@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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.