搜索

首页  >  问答  >  正文

php - 两个正则表达式的效果不一样

匹配字符串"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
    Array
    (
        [0] => abc    123
        [1] => abc
        [2] => 123
    )
    
    // $tmp1
    Array
    (
        [0] => abc    123
        [1] =>
        [2] => abc    123
    )

为什么结果匹配不一样,需要注意什么么。

ringa_leeringa_lee2820 天前544

全部回复(3)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:10:16

    前两位同学都没有回答到点儿上。
    我来解答一下吧,

    真正的秘密在于惰性(或叫非贪婪)匹配的规则:

    星号或加号后跟个问号,就表示惰性匹配,意思是尽可能少的匹配。

    1. /(.*?)s+/,加号表示前面的匹配(也就是空格s) 出现1次或多次。 这段的意思是尽可能少的匹配,后面至少有一个空格s。 这么看,前面这个括号它能匹配到 abc。

    2. /(.*?)s*/,星号表示前面的匹配 (也就是空格s) 出现0次或多次。 这段的意思是尽可能少匹配,后面可以啥都没有(s*)。 这样就得到了一个空字符串,啥都没匹配到。

    回复
    0
  • 阿神

    阿神2017-05-16 13:10:16

    注意看正则通配符s+ 和 s* 结果肯定不一样啊。
    "*" 匹配前面的子表达式零次或多次。例如,zo"*" 匹配前面的子表达式零次或多次。例如,zo能匹配“z"以及"zoo"。等价于{0,}。
    "+"能匹配“z"以及"zoo"。

    等价于{0,}。

    "+" 匹配前面的子表达式一次或多次。例如,“zo+"能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}。 /^(.

    ?)s+(.

    ?)$/

    前面的"/"和后面的"/"表示开始和结束没实际意义。
    第一个"^"表示匹配文本的开头
    ()是优先级从左到右"."表示匹配任意字符,"*"表示匹配0次以上

    第一个括号里就是匹配所有字符,"?"非贪婪匹配,表示零次或一次匹配前面的字符或子表达式。

    s是任何空白字符

    🎜推荐个教程给你学一下:正则表达式30分钟入门🎜

    回复
    0
  • PHPz

    PHPz2017-05-16 13:10:16

    更正下答案,惰性匹配所致,这也是正则难点之一。

    所谓惰性匹配你可以通俗的理解为: 你不告诉它前面有东西,它就不走。 第一个正则里面,你告诉它往前走遇到至少一个空格就可以停下来算匹配到了。
    第二个正则,你告诉它往前走,可以不用碰到空格也可以碰到空格算匹配,它很懒,干脆不动了,什么都不匹配。

    回复
    0
  • 取消回复