2

以下は、私が遊んでいたスクリプトです。以下のスクリプトを使用すると、印刷されますa

$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.])/ ) {
   print $1."\n";
}

しかし、次のように変更すると:

$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.]+)/ ) {
   print $1."\n";
}

次に、次のように出力します。cd abc/test/.

私の理解では、 + は一致するシーケンスの 1 つ以上に一致します。間違っている場合は修正してください。しかし、なぜ最初のケースでのみ一致するのaでしょうか? 何にでも合うべきだと思いました!!

ありがとうございました。

4

2 に答える 2

3

正規表現では、括弧内の文字は、指定された括弧内の1文字の一致としてのみカウントされます。つまり、[\w\/\.]次の文字のいずれかに正確に一致します。

  1. 英数字または"_"( \w)。
  2. スラッシュ (\/スラッシュは、正規表現の開始と終了のデフォルト マーカーとして使用されるため、エスケープする必要があることに注意してください)
  3. ピリオド ( -- も\.エスケープされているので.、改行文字以外の任意の文字を示します)。

/cd ([\w\/\.])./は 1 文字のみを にキャプチャするため$1、最初の文字 (この場合は ) を取得し"a"ます。

+が 1 つ以上のそのような文字の一致を許可するという点で、あなたは正しいです。正規表現はデフォルトで貪欲に一致するため、2 番目の一致ですべての"abc/test/."forを取得する必要があります$1

まだ行っていない場合は、熟読することをお勧めしますperldoc perlretut

于 2011-11-07T17:22:22.087 に答える
3

あなたは正しいです。最初のケースでは、その文字クラスの 1 文字と一致しますが、2 番目のケースでは、最初の文字クラスの後にできるだけ多くの文字を含めて、少なくとも 1 文字と一致します。

最初の1つ :

"
cd\            # Match the characters “cd ” literally
(              # Match the regular expression below and capture its match into backreference number 1
   [\w\/\.]       # Match a single character present in the list below
                     # A word character (letters, digits, etc.)
                     # A / character
                     # A . character
)
"

二つ目 :

"
cd\            # Match the characters “cd ” literally
(              # Match the regular expression below and capture its match into backreference number 1
   [\w\/\.]       # Match a single character present in the list below
                     # A word character (letters, digits, etc.)
                     # A / character
                     # A . character
      +              # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
"
于 2011-11-07T17:22:50.363 に答える