正規表現でのスラッシュのエスケープ


106

私の質問は単純な質問で、正規表現のエスケープについてです。/正規表現でスラッシュをエスケープする必要がありますか?そして、あなたはそれをどうやってやりますか?


1
どの言語/正規表現の実装を使用していますか?
ガンボ

興味深いことに、Javascriptに関するこの質問を探していました。しかし、それから私のIDEは不必要なエスケープを使用していると言いました。だからmyStr.replace(/[/:.-]+/gi, '_')私の驚きに有効です。必要になると思いました/[\/:.-]+/gi。これがかっこいいかわかりにくいかは判断できません。
ターボ

回答:


90

どんな文脈/言語?一部の言語/はパターン区切り文字として使用するため、どの言語/コンテキストに応じて、エスケープする必要があります。あなたはそれの前にバックスラッシュを置くことによってそれをエスケープします:\/(PHPのような)いくつかの言語では区切り文字として他の文字を使うことができるのでそれをエスケープする必要はありません。しかし、すべての言語でのAFAIKの唯一の特別な意味は/、指定されたパターン区切り文字であることです。


38

ここにいくつかのオプションがあります:

  • Perlでは、代替の区切り文字を選択できます。に限定されていませんm//。など、別のものを選択できますm{}。その後、エスケープする必要はありません。実際のところ、「Perlベストプラクティス」のDamian Conway m{}は、これが使用すべき唯一の代替デリミタであることを主張しており、これはPerl :: Critic(CPAN上)によって強化されています。あなたは、代替区切り文字のさまざまな方法を使って逃げる、することができますが//{}に後で解読する最も明確であるように見えます。ただし、これらの選択のいずれかによりエスケープが大きくなりすぎる場合は、読みやすさに最も適した方を選択してください。一般的な例でありm(...)m[...]m!...!

  • 代替デリミタを使用できないか、使用したくない場合はm/\/[^/]+$/、たとえば、バックスラッシュでスラッシュをエスケープ できm{/[^/]+$}ます。バックスラッシュでスラッシュをエスケープすることは、名前とウィキペディアのページを獲得するのに十分一般的です:傾いたつまようじ症候群。単一のインスタンスしかない正規表現では、スラッシュをエスケープしても、読みやすさの妨げと見なされるレベルにはならない場合がありますが、スラッシュが手に負えなくなり、Perlのように言語が代替の区切り文字を許可している場合は、推奨されるソリューションです。


1
例を挙げていただけますか?私はこれを持っています:perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confそして、私はフォワードスラッシュと衝突しています。
CMCDragonkai 2013年

正規表現で置換(別名置換)を行う場合は、sではなくを使用することに注意してくださいmperlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf...しかし、これはおそらくより良いですperl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.conf。シェルの補間を回避するためです。
DavidO

1
リテラル/文字をエスケープする代わりに、16進数または8進数のASCIIエンコーディングで文字を指定する正規表現機能を使用することもできます。Perlは8進形式\57(source regular-expressions.info/refcharacters.html)を受け入れます
lukeuser

lukeuser(ありがとう)によってリンクされたページには、エスケープシーケンス\ Q ... \ Eもあります。これでうまくいきました。
user3012857

11

バックスラッシュを使用する\か、別の区切り文字を選択します。つまりm#.\d#/.\d/ 「Perlでは、/正規表現の区切り文字の前に文字m(一致)を付けると、ほとんどすべての特殊文字に変更できます。」


6

区切り文字が/の場合、エスケープする必要があります。


0

C#を使用している場合は、エスケープする必要はありません。


可能性がありますが、ここではperlを使用しています。
Toto

0

Javaの場合、その必要はありません。

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

/の前に\を置くと。IDEは「ReGexでの冗長文字エスケープ "\ /"」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.