3

私はの基本的なルールを理解するのに多くの問題を抱えており、regex誰かが「平易な英語」でそれらを説明するのを手伝ってくれることを願っています。

$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. (3)';

print "Enter a regular expression: ";
my $pattern = <STDIN>;
chomp($pattern);

if (/$pattern/) {
    print "The text matches the pattern '$pattern'.\n";
    print "\$1 is '$1'\n" if defined $1;
    print "\$2 is '$2'\n" if defined $2;
    print "\$3 is '$3'\n" if defined $3;
    print "\$4 is '$4'\n" if defined $4;
    print "\$5 is '$5'\n" if defined $5;
}

3つのテスト出力

Enter a regular expression: ([a-z]+)
The text matches the pattern '([a-z]+)'
$1 is 'silly'

Enter a regular expression: (\w+)
The text matches the pattern '(\w+)'
$1 is '1'

Enter a regular expression: ([a-z]+)(.*)([a-z]+)
The text matches the pattern '([a-z]+)(.*)([a-z]+)'
$1 is 'silly'
$2 is " sentence (495,a) *BUT* one which will be usefu'
$3 is 'l'

私の混乱は次のとおりです

  1. ([a-z]+)「小文字のアルファベットと1つ以上の繰り返し」を意味するのではありませんか?もしそうなら、「予定」も取り上げられるべきではありませんか?()が記憶に関するものであることに関係がない限り(つまり、「愚かな」は5文字の単語であるため、「will」は取り上げられませんが、「willx」は取り上げられますか??)

  2. (\w+)「任意の単語と1つ以上の繰り返し」を意味するのではありませんか?もしそうなら、繰り返しがなくコロン「:」が後にあるので、なぜ数字「1」がピックアップされるのですか?

  3. ([a-z]+)(.*)([a-z]+)「任意の小文字と繰り返し」、直後に「すべてと0以上の繰り返し」、直後に「任意の小文字と繰り返し」を意味しますか?もしそうなら、なぜ出力は上記のように見えるのですか?

私はできる限りオンラインで調べようとしましたが、それでも理解できませんでした。どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

6
  1. いいえ、「1つ以上のアクセントのない小文字のラテン文字」を意味します。

    はい、一致しますが、."will"を使用しない限り、matchopは最初の一致のみを返します/g

    print "$1\n" while /([a-z]+)/g;  # //g in scalar context
       or
    print "$_\n" for /([a-z]+)/g;    # //g in list context
    

    使用方法の詳細については、perlopを参照m/PATTERN/ください/g

  2. いいえ、「1つ以上の単語文字」を意味するため、実際に1文字に一致する可能性があります。

    それとも、それ1が文字という単語であることに驚いていますか?ASCII範囲では、charsという単語はA-Z、、、a-zおよび0-9です_。別の102,661語の文字がASCII範囲外で見つかりました。

  3. これは、「1つ以上のアクセントのない小文字のラテン文字、その後に改行以外の任意の数の文字、その後に1つ以上のアクセントのない小文字のラテン文字」を意味します。

    なぜそんなに.*一致しているのかと尋ねるなら、エンジンは常に現在の場所で可能な限り一致します。これは貪欲と呼ばれます。

    多分あなたは探しています/([a-z]+)([^a-z]+)([a-z]+)/

于 2013-03-24T22:53:06.857 に答える
0
  1. なぜあなたがそれを期待するのか私にはよくわかりません。それはあなたの文を見て、最初の小文字を見つけ、それが見つからなくなるまでそれらを照合し続けます。(あなたの場合はスペース)一致は「ばかげている」であり、そうあるべきです。マッチングはその時点で停止します。

  2. \w「単語文字」に一致し、数字は含まれますが、「_」以外の句読点は含まれません。「:」は単語文字ではないため、「1」だけが表示されます。

  3. これは、(.*)が「貪欲」であるためです(通常は使用しないでください)。あなたはPerlに何でもすべてを行の終わりに一致させるように言っています。次に、バックトラックして、文字列の最後の文字である最後のチェックに一致するものを提供します。

編集:@ikegamiが指摘したように、\w実際には私が考えていたものよりもかなり一致しています。

于 2013-03-24T22:53:04.653 に答える