In einem regulären Ausdruck einem Schrägstrich entkommen

106

Meine Frage ist einfach und es geht darum, dass reguläre Ausdrücke entkommen. Müssen Sie einem Schrägstrich /in einem regulären Ausdruck entkommen ? Und wie würden Sie vorgehen?

Zerobu
quelle
1
Welche Implementierung für Sprache / reguläre Ausdrücke verwenden Sie?
Gumbo
Interessanterweise suchte ich nach dieser Frage für Javascript. Aber dann sagte meine IDE, ich würde eine unnötige Flucht nutzen. Das myStr.replace(/[/:.-]+/gi, '_')gilt also zu meiner Überraschung. Ich dachte, ich würde brauchen /[\/:.-]+/gi. Ich kann mich nicht entscheiden, ob das cool oder verwirrend ist.
Turbo

Antworten:

90

Welcher Kontext / welche Sprache? Einige Sprachen werden /als Musterbegrenzer verwendet. Ja, Sie müssen ihn je nach Sprache / Kontext maskieren. Sie entkommen ihm, indem Sie einen Schrägstrich davor setzen: \/Für einige Sprachen (wie PHP) können Sie andere Zeichen als Trennzeichen verwenden und müssen ihn daher nicht umgehen. Aber AFAIK in allen Sprachen, die einzige besondere Bedeutung, die es /hat, ist, dass es möglicherweise das bezeichnete Mustertrennzeichen ist.

Wachsmalstift gewalttätig
quelle
38

Hier sind einige Optionen:

  • In Perl können Sie alternative Trennzeichen auswählen. Du bist nicht darauf beschränkt m//. Sie könnten eine andere wählen, wie z m{}. Dann ist Flucht nicht notwendig. Tatsächlich behauptet Damian Conway in "Perl Best Practices", dass dies m{}der einzige alternative Begrenzer ist, der verwendet werden sollte, und dies wird durch Perl :: Critic (auf CPAN) verstärkt. Sie können zwar mit einer Vielzahl von alternativen Trennzeichen davonkommen //und {}scheinen später am klarsten zu entziffern zu sein. Wenn jedoch eine dieser Optionen zu viel Flucht führt, wählen Sie diejenige aus, die sich am besten für die Lesbarkeit eignet. Gängige Beispiele sind m(...), m[...]und m!...!.

  • In Fällen, in denen Sie keine alternativen Trennzeichen verwenden können oder möchten, können Sie die Schrägstriche mit einem umgekehrten Schrägstrich umgehen: m/\/[^/]+$/Verwenden Sie beispielsweise ein alternatives Trennzeichen m{/[^/]+$}, das möglicherweise deutlicher lesbar wird. Es ist häufig genug, dem Schrägstrich mit einem Backslash zu entkommen, um sich einen Namen und eine Wikipedia-Seite verdient zu haben: Leaning Toothpick Syndrome . In regulären Ausdrücken, in denen es nur eine einzige Instanz gibt, wird das Entkommen eines Schrägstrichs möglicherweise nicht als Hindernis für die Lesbarkeit angesehen. Wenn dies jedoch außer Kontrolle gerät und Ihre Sprache alternative Trennzeichen wie Perl zulässt, würde dies der Fall sein die bevorzugte Lösung sein.

DavidO
quelle
1
Kannst du ein Beispiel geben? Ich habe folgendes: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confUnd ich bekomme Konflikte mit Schrägstrichen.
CMCDragonkai
Beachten Sie, dass Sie beim Ersetzen (auch als Ersetzen bezeichnet) durch reguläre Ausdrücke ein sund kein verwenden m. perlfect.com/articles/regex.shtml
Mashmagar
2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... aber das ist wahrscheinlich besser: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confweil es Shell-Interpolation vermeidet.
DavidO
1
Eine Alternative zum Escapezeichen des Literalzeichens /besteht darin, die Regex-Funktionalität zum Angeben eines Zeichens durch seine ASCII-Codierung in Hex oder Oktal zu verwenden. Perl akzeptiert die oktale Form \57(Quelle regulär-
expressions.info/
Auf der von lukeuser verlinkten Seite (danke) befindet sich auch die Escape Sequence \ Q ... \ E. Das hat bei mir funktioniert.
user3012857
11

Verwenden Sie den Backslash \oder wählen Sie ein anderes Trennzeichen, dh m#.\d#anstelle von /.\d/ "In Perl können Sie das Trennzeichen für reguläre Ausdrücke in fast jedes andere Sonderzeichen ändern, wenn Sie den Buchstaben m (für Übereinstimmung) voranstellen."


quelle
6

Wenn das Trennzeichen / ist, müssen Sie entkommen.

fvox
quelle
0

Wenn Sie C # verwenden, müssen Sie es nicht maskieren.

ShrapNull
quelle
Mag sein, aber hier verwenden sie Perl.
Toto
0

Für Java brauchen Sie nicht.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Wenn Sie \ vor / setzen. IDE sagt Ihnen "Redundant Character Escape" \ / "in ReGex"

Amzero
quelle