php - 2 つの正規表現には異なる効果があります
ringa_lee
ringa_lee 2017-05-16 13:08:16
0
3
534

文字列「abc 123」と一致します。 abcと123を取り出してもらいます。

<?php
    $str = "abc 123";
    $preg = "/^(.*?)\s+(.*?)$/";
    $preg1 = "/^(.*?)\s*(.*?)$/";
    preg_match($preg, $str, $tmp);
    preg_match($preg1, $str, $tmp1);
    
    echo '<pre>';
    print_r($tmp);
    print_r($tmp1);
    echo '</pre>';
    
    // $tmp
    配列
    (
        [0] => abc 123
        [1] =>
        [2] => 123
    )
    
    // $tmp1
    配列
    (
        [0] => abc 123
        [1] =>
        [2] => ABC 123
    )

マッチング結果が異なるのはなぜですか?注意する必要があることはありますか?

ringa_lee
ringa_lee

ringa_lee

全員に返信(3)
伊谢尔伦

最初の 2 人の学生はどちらも要点を答えていませんでした。
答えさせてください

本当の秘密は惰性(或叫非贪婪)匹配のルールにあります:

アスタリスクまたはプラス記号の後に疑問符が続く場合は、遅延マッチングを示します。これは、マッチングを可能な限り少なくすることを意味します。

  1. /(.*?)s+/、プラス記号は、前の一致 (つまり、スペース s) が 1 回以上出現することを示します。 この段落は、一致をできる限り少なくし、その後に少なくとも 1 つのスペースを続けることを意味します。 こうやってみると、先ほどの括弧はabcと一致することができます。

  2. /(.*?)s*/、アスタリスクは、前の一致 (つまり、スペース s) が 0 回以上出現することを示します。 この段落の意味は、一致をできる限り少なくすることであり、その後に何も存在することはできません (s*)。 これにより、何も一致しない空の文字列が生成されます。

いいねを押す +0
阿神

通常のワイルドカード s+ と s* の結果は明らかに異なることに注意してください。
"*" 直前の部分式と 0 回以上一致します。たとえば、zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
"+" は「z」と「zoo」に一致します。

は {0,} と同等です。

"+" 前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。 /^(.

?)s+(.

?)$/

前の「/」と後ろの「/」は、始まりと終わりに実質的な意味がないことを示します。
最初の「^」はテキストの先頭と一致することを意味します
()は左から右への優先順位です。「.」は任意の文字と一致することを意味し、「*」は0回以上一致することを意味します

最初の括弧はすべての文字と一致することを意味します。 「 ?」 非貪欲一致。前の文字または部分式を 0 回または 1 回一致させることを意味します。

s は任意の空白文字です

🎜学習におすすめのチュートリアル: 正規表現の 30 分入門🎜
いいねを押す +0
PHPzhong

答えを修正します。これは、正規表現の難しさの 1 つである遅延マッチングが原因です。

いわゆる怠惰なマッチングは、一般的な方法で理解できます。つまり、その前に何かがあることを伝えなければ、それは進みません。 最初の通常ルールでは、前進し、少なくとも 1 つのスペースに遭遇したら停止して、一致としてカウントするように指示します。
2 番目の通常のルールでは、スペースに遭遇する必要はありません。スペースに遭遇した場合は一致としてカウントされ、何も一致しません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート