免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2269 | 回复: 7
打印 上一主题 下一主题

关于匹配中//g的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-01 16:44 |只看该作者 |倒序浏览
有一段程序如下
while($maze[$x][$y]=~/[nsew]/g){
    print "$full{$1}";
}
有两个问题
首先:条件判断中//g修饰符有什么作用?
第二:循环如何运行的?

论坛徽章:
0
2 [报告]
发表于 2010-10-01 16:51 |只看该作者
g是全局匹配!
如果二维数组满足匹配,存入hash数组full中

论坛徽章:
0
3 [报告]
发表于 2010-10-01 17:08 |只看该作者
回复 2# alfred1980


    程序打的有点问题:
while($maze[$x][$y]=~/([nsew])/g){
      print "$full{$1}";
}
print "($maze[$x][$y])\n";
主要问题是while循环如何运行,什么时候退出,执行下一句

论坛徽章:
0
4 [报告]
发表于 2010-10-01 17:12 |只看该作者
只要你的数组里的元素符合模式匹配,就一直运行下去!

论坛徽章:
0
5 [报告]
发表于 2010-10-01 17:56 |只看该作者
回复 4# alfred1980


    还是有点不太明白,如果$maze[$x][$y]和/([nsew])/匹配成功,不就意味着一直循环下去了?

论坛徽章:
0
6 [报告]
发表于 2010-10-01 20:50 |只看该作者
回复 5# alias26


有g修饰就不会,如果没有这个g就会一直循环
其原理我们举个例子来说明
首先/([nsew])/的意思是匹配一个字符,匹配n或者s或者e或者w
假如$maze[$x][$y] = 'aefmnrsxuvwyz'

有g修饰时,正则表达式的起始匹配位置会从上次匹配成功的结束位置开始
循环第一次时,匹配成功了e,那么第二次匹配字符串时就会从f开始
于是循环第二次时,就会匹配n,然后第三次匹配就从r开始
继续下去
最后一次匹配成功是w,下一次匹配时就从y开始,匹配失败,就退出循环了

没有g修饰时,正则表达式的起始匹配位置始终从字符串的起始位置(也就是a)开始匹配
这样每次循环都能匹配成功,匹配的都是e

论坛徽章:
0
7 [报告]
发表于 2010-10-02 15:37 |只看该作者
回复 6# 珞水的大叔


    呵呵,谢过了,终于理解了!

论坛徽章:
20
CU大牛徽章
日期:2013-04-17 11:48:26羊年新春福章
日期:2015-03-10 22:39:202015年中国系统架构师大会
日期:2015-06-29 16:11:282015亚冠之平阳省
日期:2015-07-31 09:19:042015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-09-30 06:20:002015亚冠之柏太阳神
日期:2015-10-19 20:29:5915-16赛季CBA联赛之天津
日期:2016-11-29 14:03:4315-16赛季CBA联赛之北控
日期:2016-12-24 20:51:492015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-12 20:58:532014年中国系统架构师大会
日期:2014-10-14 15:59:00
8 [报告]
发表于 2010-10-26 20:09 |只看该作者
回复  alias26


有g修饰就不会,如果没有这个g就会一直循环
其原理我们举个例子来说明
首先/([nsew ...
珞水的大叔 发表于 2010-10-01 20:50



    讲得很详细啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP