2016-04-07 12 views
2

Ich bin hier gegen ein seltsames Problem. Wenn ich renne:Regex Entfernen Hash von Anfang

"#/a/b/c/d".replace("#\/","") 

Ich bekomme, was ich erwarten würde: a/b/c/d.

Aber wenn ich voraus diese Regex mit einem Start der Zeichenfolge ^, zu bekommen:

"#/a/b/c/d".replace("^#\/","") 

Diese "#a/b/c/d" die ursprüngliche Zeichenfolge zurückgibt.

Kann jemand erklären, warum der Hash nicht entfernt wird, und möglicherweise eine Alternative vorschlagen, die den Hash nur entfernen würde, wenn er am Anfang der Zeichenfolge erscheint?

+2

Übergeben Sie das Regex-Objekt: '" #/a/b/c/d ".replace (/^# \ //," ")' –

+1

Regexes haben eine spezielle Syntax mit Schrägstrichtrennzeichen, keine Anführungszeichen. – trincot

+0

oder '" #/a/b/c/d ".replace (RegExp ("^#/")," ")' –

Antwort

0

Wenn Sie eine Zeichenfolge als erstes Argument zu .replace() Methode übergeben, wird der String als Literal verwendet und nur 1 Ersatz gemacht werden kann.

Siehe MDN replace reference:

substr (pattern)
Ein String, der durch newSubStr ersetzt werden soll. Es wird als eine Verbatim-Zeichenfolge behandelt und nicht als regulärer Ausdruck interpretiert.

Was Sie brauchen, ist das Regex-Objekt als erstes Argument übergeben.

"#/a/b/c/d".replace(/^#\//,"") 
        ^^^^^^ 

Es hat keinen Sinn, eine Konstruktor Notation (RegExp("^#/") da das Muster aufgebaut ist nicht dynamisch von Variablen bei der Verwendung

Es gibt keine doppelte Schrägstriche im Muster! die äußere /.../ sind regex Begrenzungszeichen genannt. Dann, was insde ist ein Muster. Das Muster ist ^#/, aber da die / als Regex-Trennzeichen verwendet werden, muss das / im Muster mit Escapezeichen versehen werden, um ein Literal / (nur in der Regex-Literalnotation) zu entsprechen.

+0

Danke dafür :) Das fand ich sehr hilfreich – user2662833

0

String.replace nimmt als erstes Argument entweder eine Zeichenfolge oder eine Regexp. Wenn Sie eine Zeichenfolge eingeben, wird nicht als interpretiert oder in einen regulären Ausdruck konvertiert. es wird buchstäblich behandelt. Wenn Sie daher ^ zu Ihrer Zeichenfolge hinzufügen, ersetzt es nichts, da ^ in der Eingabe fehlt.

Wie in den Kommentaren erläutert, können Sie entweder ein regexp-Literal (/.../) als erstes Argument übergeben, oder Sie könnten ein regexp mit new RegExp konstruieren (aber warum sollten Sie das tun?).

1

Das erste Argument zu replace kann entweder eine Zeichenfolge oder ein regulärer Ausdruck sein.

Sie übergeben eine Zeichenfolge, also sucht sie nach einer genauen Übereinstimmung für diese Zeichenfolge.

Übergeben Sie stattdessen einen regulären Ausdruck.

"#/a/b/c/d".replace(/^#\//,"")