1

以前の支援に感謝します。Perl の RegExp について質問があります

私の問題は..

マッチングするときは、m// または // または ## を書くことができます (これを使用する場合は、m または s を含める必要があります)。混乱を引き起こしているのは、私が持っているエスケープ文字に関する本の例です。私は、ほとんどの人が多くの文字をエスケープすると信じています。これは、プログラムがメタ文字を見逃さずに動作する確実な方法です。

これが私の問題であり、このスクリプトが何をするかを知っています:

$date= "15/12/99"
$date=~ s#(\d+)/(\d+)/(\d+)#$1/$2/$3#; << why are no forward slashes escaped??
print($date);

しかし、私が持っている後の例は、次のように書き直されたことを示しています(これも理解しており、エスケープされています)

$date =~ s/()(\d+)\/(\d+)\/(d+)/$2\/$1\/$3; <<<<which is escaping the forward slashes.

スラッシュまたはハッシュがプログラマーの好みとその使用法であることは知っています。私が理解していないのは、なぜ 2 番目の例がスラッシュをエスケープしているのに、最初の例がそうでないのかということです。ハッシュでスラッシュをエスケープしませんか? さらに紛らわしいのは、これより前に私が持っているさらに別の本の例を見ると、ハッシュを再び使用すると、@ 記号もエスケープされます。

if ($address =~ m#\@#) { print("That's an email address"); }または似たようなもの

では、ハッシュやスラッシュを使用していないものから何をエスケープしますか? メタ文字を一致させるにはエスケープする必要があることは知っていますが、混乱しています。

4

6 に答える 6

8

正規表現を作成するときは、正規表現の区切り文字として文字を定義します。つまり、//orを実行します##
正規表現内でその文字を使用する必要がある場合は、正規表現エンジンが正規表現の終わりとして認識しないように、エスケープする必要があります。

スラッシュの間に正規表現を作成する場合は/、正規表現に含まれるスラッシュをエスケープする必要があるため、2 番目の例ではエスケープしています。

もちろん、スラッシュだけでなく、正規表現の区切り文字として使用する任意の文字にも同じ規則が適用されます。

于 2011-02-15T14:07:37.160 に答える
4

スラッシュはそれ自体がメタ文字ではありません。2番目の例で式の区切り文字として使用するだけで、スラッシュは「特別」になります。

置換式の形式は次のとおりです。

s<expression separator char><expression to look for><expression separator char><expression to replace with><expression separator char>

最初の例では、=〜sの後の最初の文字としてハッシュを使用すると、その文字が式の区切り文字になるため、スラッシュは特別ではなく、エスケープする必要はありません。2番目の例では、式の区切り文字は実際にはスラッシュであるため、式自体の中でエスケープする必要があります。

于 2011-02-15T14:09:23.100 に答える
3

regex match-operator を使用すると、カスタムの非空白文字を区切り文字として定義できます。

最初の例では、「#」がセパレータとして使用されています。したがって、この正規表現では特別な意味がないため、「/」をエスケープする必要はありません。2 番目の正規表現では、セパレータ char は変更されません。したがって、デフォルトの「/」が使用されます。ここで、パターン内のすべての「/」をエスケープする必要があります。そうしないと、パーサーが混乱します。:)

于 2011-02-15T14:08:20.820 に答える
3

質問自体は、いくつかの回答で適切に回答されています。しかし、Perl の正規表現について常に知りたいと思っていたものの、尋ねるのを恐れていたかもしれないし、恐れていなかったかもしれないことはすべて、 perldoc perlreperldoc perlrequick、およびperldoc perlretutで見つけることができます。それらを一読することをお勧めします。

于 2011-02-15T14:15:22.347 に答える
2

スラッシュを使用しない場合は、中括弧と/x修飾子を使用することをお勧めします。

$date=~ s{ (\d+) \/ (\d+) \/ (\d+) }{$1/$2/$3}x;

非英数字をエスケープすることも、メタ文字でなくても標準です。を参照してくださいperldoc -f quotemeta

于 2011-02-15T14:30:11.493 に答える
0

s 修飾子を使用してスラッシュをエスケープすることについて、この質問には別の深みがあります。私の例では、キャプチャが問題になります。

$image_name =~ s/((http:\/\/.+\/)\/)/$2/g;

これを機能させるには、2 つ目のスラッシュを追加したタイプミスをキャプチャする必要がありました。また、2 つのスラッシュだけで作業しようとしてもうまくいきませんでした。最初のスラッシュは、複数の文字で始まる必要があります。「 http://world.com/Photos//space_shots/out_of_this_world.jpg」 を「 http://world.com/Photos/space_shots/out_of_this_world.jpg」に

変更

于 2013-10-28T10:11:00.570 に答える