Escape-Punkt in einem Regex-Bereich

76

Aus irgendeinem Grund verhalten sich diese beiden Regex genauso:

"43\\gf..--.65".replace(/[^\d.-]/g, "");​  // 43..--.65
"43\\gf..--.65".replace(/[^\d\.-]/g, "");​  // 43..--.65

Demo

Im ersten regulären Ausdruck entkomme ich dem Punkt ( .) nicht, während ich im zweiten regulären Ausdruck ( \.) entkomme .

Was sind die Unterschiede und warum verhalten sie sich gleich?

Gdoron unterstützt Monica
quelle

Antworten:

61

Weil sich der Punkt innerhalb der Zeichenklasse befindet (eckige Klammern []).

Werfen Sie einen Blick auf http://www.regular-expressions.info/reference.html , heißt es (unter char class section):

Jedes Zeichen außer ^ -] \ fügt dieses Zeichen zu den möglichen Übereinstimmungen für die Zeichenklasse hinzu.

Usoban
quelle
7
und das minus ( -) muss nur maskiert werden, wenn es in der Mitte des Bereichs liegt?
Gdoron unterstützt Monica
3
Wenn Sie einen Bindestrich finden möchten, fügen Sie ihn sofort nach dem Öffnen der eckigen Klammer hinzu, z. B. [-AZ]. Andernfalls gibt der Bindestrich den Bereich an. In Ihrem Fall funktioniert dies wahrscheinlich nur, weil Sie in Regex keinen Bereich angeben. Ich würde jedoch empfehlen, dass Sie der Referenz folgen, falls Sie später einen Bereich hinzufügen.
Usoban
3
oder unmittelbar vor der schließenden Klammer, oder Sie könnten es mit einem Schrägstrich entkommen
Code Jockey
97

Der Punktoperator .muss nicht innerhalb einer Zeichenklasse maskiert werden [].

jbabey
quelle
34

Wenn Sie Ihren Regex mit JavaScript testen, versuchen Sie es \\.stattdessen mit \..

Es verhält sich genauso, weil JS den ersten Backslash entfernt.

MMiroslav
quelle
3
Dieser hat mich heute gerettet. Ich konnte nicht herausfinden, warum der Ausdruck nicht funktionieren würde. Vielen Dank
Mārtiņš Radiņš
4

Auf dieser Webseite sehe ich Folgendes:

"Denken Sie daran, dass der Punkt kein Metazeichen innerhalb einer Zeichenklasse ist, sodass wir ihn nicht mit einem Backslash umgehen müssen."

Ich denke also, das Entkommen ist unnötig ...

Rob ich
quelle