文字列「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
)
マッチング結果が異なるのはなぜですか?注意する必要があることはありますか?
最初の 2 人の学生はどちらも要点を答えていませんでした。
答えさせてください
本当の秘密は
惰性(或叫非贪婪)匹配
のルールにあります:アスタリスクまたはプラス記号の後に疑問符が続く場合は、遅延マッチングを示します。これは、マッチングを可能な限り少なくすることを意味します。
/(.*?)s+/
、プラス記号は、前の一致 (つまり、スペース s) が 1 回以上出現することを示します。 この段落は、一致をできる限り少なくし、その後に少なくとも 1 つのスペースを続けることを意味します。 こうやってみると、先ほどの括弧はabcと一致することができます。/(.*?)s*/
、アスタリスクは、前の一致 (つまり、スペース s) が 0 回以上出現することを示します。 この段落の意味は、一致をできる限り少なくすることであり、その後に何も存在することはできません (s*)。 これにより、何も一致しない空の文字列が生成されます。通常のワイルドカード s+ と s* の結果は明らかに異なることに注意してください。
は {0,} と同等です。"*"
直前の部分式と 0 回以上一致します。たとえば、zo"*"
匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。"+"
は「z」と「zoo」に一致します。
?)s+(."+"
前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。 + は {1,} と同等です。 /^(.?)$/
最初の括弧はすべての文字と一致することを意味します。 「 ?」 非貪欲一致。前の文字または部分式を 0 回または 1 回一致させることを意味します。前の「/」と後ろの「/」は、始まりと終わりに実質的な意味がないことを示します。
最初の「^」はテキストの先頭と一致することを意味します
()は左から右への優先順位です。「.」は任意の文字と一致することを意味し、「*」は0回以上一致することを意味します
s は任意の空白文字です
🎜学習におすすめのチュートリアル: 正規表現の 30 分入門🎜答えを修正します。これは、正規表現の難しさの 1 つである遅延マッチングが原因です。