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?

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.


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 [].


34

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

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


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 ...

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.