0

私はPerlと正規表現の経験が豊富です。しかし、これは私を夢中にさせています。私はそれに対する答えを見つけることができず、その理由もわかりません。次のコードを見てください。

my $str = 'Hello[world]';

say $str =~ m/\w+\[.*?\]/ ? 'Yes' : 'No';
say $str =~ m[\w+\[.*?\]] ? 'Yes' : 'No';
say $str =~ m(\w+\[.*?\]) ? 'Yes' : 'No';

これの出力は次のとおりです。

Yes
No
Yes

ご覧のとおり、変更しているのは正規表現の区切り文字だけであり、区切り文字が角かっこである場合に期待するように式が機能していません。

誰かが2番目のものが一致しない理由を説明できますか?

前もって感謝します、

フランシスコ

4

2 に答える 2

6

B::Deparseモジュールが助けになります:

$ perl -MO=Deparse foo.pl
my $str = 'Hello[world]';
say $str =~ /\w+\[.*?\]/u ? 'Yes' : 'No';
say $str =~ /\w+[.*?]/u ? 'Yes' : 'No';
say $str =~ /\w+\[.*?\]/u ? 'Yes' : 'No';
foo.pl syntax OK

ご覧のとおり[ ]、正規表現でのエスケープは、perl がそれらを区切り文字ではなくメタ文字として解釈するようになったことを意味します。2 レベルのエスケープが必要です。\\文字通りのバックスラッシュとして解釈されるため、これが可能かどうかさえわかりません。

さらに明確にするために:通常の正規表現では、括弧[]はメタ文字ステータスを持っています。したがって、文字どおりに一致させるには、エスケープする必要があります。それらを区切り文字として使用する場合、それらに別のメタ文字ステータスを追加します。これらは区切り文字でもあります。したがって、両方のメタ文字ステータスをエスケープする必要があります。

これは意図したとおりに機能します。

say $str =~ m[\w+\Q\[\E.*?\Q\]\E] ? 'Yes' : 'No';

もちろん、ここでの教訓は区切り文字を賢く選択することです。

于 2013-03-15T13:36:47.517 に答える
0

マッチを実行する前に、 andを(または別の同様の置換[で) 置き換えてみてください。<]>

于 2013-07-29T20:09:39.610 に答える