5

私はPerlREをある程度理解していると思いましたが、これは私を困惑させています。

#!/usr/bin/perl
use strict;
use warnings;

my $test = "'some random string'";

if($test =~ /\'?(.*?)\'?/) {
       print "Captured $1\n";
       print "Matched $&";
}
else {
       print "What?!!";
}

プリント

キャプチャされ
た一致'

エンディングだけで一致しているようで、何もキャプチャされていません。
私はそれが全体に一致することを期待していました、またはそれが完全に貪欲でない場合は、まったく何もありません(すべてがオプションの一致があるため)。
これは行動の合間に私を困惑させます、誰かが何が起こっているのか説明できますか?

4

5 に答える 5

15

\'?先頭と末尾のは、貪欲に 0 または 1 つのアポストロフィに一致することを意味します。(別のポスターが指摘しているように、それを貪欲にしないためには、そうでなければなりません\'??

.*?真ん中のは、 0 個以上の文字に非貪欲に一致することを意味します。

Perl 正規表現エンジンは、文字列の最初の部分を調べます。先頭に一致しますが、貪欲に一致するため、最初のアポストロフィを取得します。次に、任意のアポストロフィが続く非貪欲に一致します (したがって、可能な限り少なくします)。これは空の文字列に一致します。

于 2009-04-03T08:19:03.840 に答える
3

pattern?貪欲です。非貪欲にしたい場合は、次のように言わなければなりませんpattern??:

#!/usr/bin/perl
use strict;
use warnings;

my $test = "'some random string'";

if($test =~ /\'?(.*?)\'?/) {
       print "Captured [$1]\n";
       print "Matched  [$&]\n";
}
if($test =~ /\'??(.*?)\'??/) {
       print "Captured [$1]\n";
       print "Matched  [$&]\n";
}

perldoc perlre から:

次の標準量指定子が認識されます。

*      Match 0 or more times
+      Match 1 or more times
?      Match 1 or 0 times
{n}    Match exactly n times
{n,}   Match at least n times
{n,m}  Match at least n but not more than m times

デフォルトでは、数量化されたサブパターンは「貪欲」です。つまり、(特定の開始位置が与えられた場合) 可能な限り多くの回数一致しますが、パターンの残りの部分は引き続き一致します。可能な最小回数に一致させたい場合は、量指定子の後に「?」を付けます。意味は変わらず、「貪欲」だけであることに注意してください。

*?     Match 0 or more times
+?     Match 1 or more times
??     Match 0 or 1 time
{n}?   Match exactly n times
{n,}?  Match at least n times
{n,m}? Match at least n but not more than m times
于 2009-04-03T07:57:03.720 に答える
3

次のような意味だと思います:

/'(.*?)'/      // matches everything in single quotes

また

/'[^']*'/      // matches everything in single quotes, but faster

一重引用符をエスケープする必要はありません。

于 2009-04-03T07:57:21.130 に答える
1

正規表現のすべての要素をオプションにする (つまり、すべての要素を * または ? で量化する) ことに注意してください。これにより、Perl 正規表現エンジンは、一致が成功したと見なしながら、必要なだけ (何もない場合でも) 一致させることができます。

私はあなたが何を望んでいると思います

/'(.*?)'/
于 2009-04-03T07:58:56.383 に答える
1

あなたが探しているものに最も近い答えは

/'?([^']*)'?/

したがって、「単一引用符がある場合はそれを取得する」、「単一引用符ではないすべてのものを取得する」、「最後の単一引用符がある場合はそれを取得する」。

「'don't do this'」に一致させたい場合を除きますが、とにかく一重引用符でアポストロフィを使用するのは誰ですか? :)

于 2009-04-16T19:33:19.383 に答える