任意字符匹配问题

任意字符匹配问题

\w匹配字母数组下划线\W匹配非字母数字下划线,用模式单元分组成为一个原子组,匹配一个任意字符 用*量词来修饰,匹配字符串的所有字符 ,  可是为什么最后会匹配一个.字符呐

$pattern = '/(\w|\W)*/';
$string = "jkrghd
gxvxc12
32.";
$result = preg_match($pattern,$string,$match);
var_dump($match);
//array(2) {
//    [0]=>
//  string(20) "jkrghd
//gxvxc12
//32."
//    [1]=>
//  string(1) "."
//}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

你好,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,并不代表匹配字符串的所有字符,\w和\W匹配的字符是互补的,\w:用于匹配字母,数字或下划线字符;\W:用于匹配所有与\w不匹配的字符,那么\w|\W能匹配到所有的字符,包括你字符串里的换行和‘.’,preg_match,正常情况下,其第三个参数$match的第一个元素$match[0]包含完整模式匹配到的所有文本,第二个元素$match[1]包含第一个捕获子组匹配到的文本,依次类推,如

$pattern = '/(abcd)*./';

$string = "abcdhaha";

$result = preg_match($pattern,$string,$matches);

print_r($matches);

//匹配结果

Array

(

    [0] => abcdh

    [1] => abcd

)

'/(\w|\W)*/'属于极端情况,无乱字符串是什么样的,正则表达式能够完全匹配所有字符,同时所有字符都在第一个捕获的子组内,因此match数组第二个元素只为字符串中的最后一个字符,不管最后一个字符是不是'.',这种情况下第二个元素都只是最后一个字符。PHP的规则就是这样的。

如果解决了你的疑问,请采纳,祝学习愉快~

  • 托儿所 提问者 #1
    第一个$match[0]包含完整模式匹配到的所有文本, 这个我能理解, match第二个元素$match[1]为什么会是字符串的最后一个字符呢?按理说\w应该是匹配到的第一个字符啊?难道是因为*是贪婪模式, 然后从右边开始匹配的?
    2018-07-18 21:29:05
  • imooc_澈 回复 提问者 托儿所 #2
    你好,按照一般情况,match[1]的内容应该是你的正则表达式第一个()匹配到的文本,跟match[0]一样,但小慕试过,但第一个括号里的正则表达试包括了所有的字符,match[1]都只能拿到捕获的文本最后一个字母。例如: $pattern = '/(\w)*/'; $string = "jkrghd " 这个match[1]就只能拿到d,而一般情况下 $pattern = '/(jkrghd)*/'; $string = "jkrghd " 这里的match[1]就拿到了第一个捕获租匹配的所有文本,也就是跟match[0]一样。
    2018-07-19 10:25:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师