2017-01-06 5 views
0

Windowsのパス(テキスト文字列)を別のパスに置き換えるために、テキストファイルのリストを検索するスクリプトがあります。Perlの正規表現のような文字列をエスケープする方法

問題は、フォルダ名の一部が数字とダッシュで始まることです。 Perlはここで正規表現を呼び出そうとしているようだ。私は、 "正規表現の存在しないグループへの参照"というメッセージを受け取ります。

文字列は次のようになります。私はこのようにそれを引用している

\\\BAGlobal\6-Engineering\3-Tech 

my $find = "\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech" 

にはどうすればいい6-3-をエスケープするのですか?

答えて

5

問題は、6-のダッシュではなく、すべてのバックスラッシュ\です。

それは\3\6が文字列foobar foobarにマッチし、/foo(bar) foo\1/のような以前にマッチしたグループへの後方参照があると思います。

あなたはパターンマッチでこれを使用する場合は、引用符を追加する\Q\Eを含める、またはあなたの$findquotemeta built-inを適用する必要があります。

my $find = '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech'; 

$string =~ m/\Q$find\E/; 

またはquotemetaとなります。

my $find = quotemeta '\\\\\\\BAGlobal\\\6-Engineering\\\3-Tech'; 

$string =~ m/$find/; 

perlreも参照してください。

あなたのサンプルコードはおそらく間違っていることに注意してください。あなたがそこに持っているバックスラッシュの数は不均等であり、二重引用符""が補間するので、バックスラッシュの各ペア\\は文字列内の1つの実際のバックスラッシュになります。しかし、そのうち7つがあるため、最後の文字はBのエスケープとして認識され、有効なエスケープシーケンスではない\Bになります。私は上記の私のコードで一重引用符''を使用しました。

+0

二重引用符は不要なので、わかりやすくするために一重引用符も使用します。 – choroba

+0

@choroba実際には二重引用符 '' ''は文字列の意味を変更します。バックスラッシュ '' \ ''の数は奇数なので、二重引用符で囲まれた文字列は '\ B'を補間しようとします。試してみてください\\\\\\\ BAGlobal \\\ 6-Engineering \\\ 3-Tech "; '\\\\\\\ BAGlobal \\\ 6-Engineering \\\ 3-Tech'; 'と言ってください。 – simbabque

+1

'\ B'は正規表現では' \ b'の否定として有効です。 – choroba

関連する問題