有几个问题问老师

有几个问题问老师

$a = "/IMO*C.*a$/U";
$b = "/(ASD)*/i";

$str = "imoocqwrwrxvimoocfsasdasdasdIMC-2335462_aaaa im ooc";

preg_match($a,$str,$matches1);
preg_match($b,$str,$matches2);

print_r($matches1);
print_r($matches2);

代码中$a正则为什么a后面添加$匹配不到内容呢? $不是以a结尾吗?
$b中用*为什么也匹配不到内容?>=0,为什么取了=0的结果,这里并没有用禁止贪婪啊
为什么$b = "/(ASD)+/i"; 用+就可以匹配出来,而且为什么结果是4个asd,可是字符串中只有三个asd啊

http://img1.sycdn.imooc.com//climg/5cb035400001b62203490165.jpg

正在回答 回答被采纳积分+1

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

4回答
guly 2019-04-12 17:35:34

你好,* 匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。如果$a = "/(asd)*/";改成$a = "/asd*/";即可匹配,

()是将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域  

而+ 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。祝学习愉快!

  • 提问者 雨之赞歌 #1
    为什么"/(asd)*/" 就不对呢? 字符串中不是有三个asd吗?按理来说应该可以匹配出来的啊 。 /(asd)+/ 就可以匹配出来啊
    2019-04-12 17:39:09
  • guly 回复 提问者 雨之赞歌 #2
    使用()包括就相当于一个组,而不是字符串了, 而+ 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z 就类似于 asd+匹配出 asdasdasd 以及asd
    2019-04-12 17:51:33
提问者 雨之赞歌 2019-04-12 17:35:14

但是在工具里却可以匹配出来,但是有错误,为什么会这样呢?

http://img1.sycdn.imooc.com//climg/5cb05bd0000157f710170182.jpg

提问者 雨之赞歌 2019-04-12 16:58:51

我再说详细一点:

$a = "/(asd)*/";

$str = "imoocqwrwrxvimoocfsasdasdasdIMC-2335462_aaaa im ooc";

preg_match($a,$str,$matches1);

print_r($matches1);

为什么 /(asd)*/ 匹配不到任何内容,*的作用是匹配前一个子表达式重复>=0次,但是这里为什么打印结果为空? 老师说过正则是贪婪的,应该结果是asdasdasd才对,而这里并没有禁止贪婪。但是为什么改成 /(asd)+/ 就可以匹配出asdasdasd  ?????


guly 2019-04-12 16:30:30

你好,$匹配文本的结束,以u结尾,U 只匹配最近的一个字符串;不重复匹配;


i 不区分(ignore)大小写;例如: /abc/i 可以匹配 abc、aBC、Abc ,

+匹配1个或多个的数量限定符,所以有两种情况存在。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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