- 论坛徽章:
- 0
|
原帖由 andy820303 于 2008-4-16 15:12 发表
The "/g" modifier specifies global pattern matching--that is,
matching as many times as possible within the string. How it
behaves depends on the context. In lis ...
post to Larry Wall
其实只要理解了正则引擎的backtrace(回朔),这样也是可以理解的
对于$_="OneoNeonE"
使用模式(one)*/i
1.正则引擎从字符串的头部开始
2.由于(one)*也匹配空,所以引擎创建 state1,这个state包含了匹配的内容,这里就是null
3.接着看到One,也匹配,所以引擎创建 state2,这个state包含了匹配内容 One
4.接着看到oNe,创建state3,包含匹配内容 oNe
5.看到onE,创建state4,包含匹配内容onE
6.这个时候(one)*整体匹配成功了,而且regex后面也没有其他需要继续匹配的东西,因而regex引擎认为整体匹配已经成功,所以没有必要backtrace了,这个时候最新的state,也就是state4里面存放的内容是onE,所以这个结果就被返回了
这些state都是存放在类似堆栈的结构中,state1在stack的底部,state4在stack的顶部
如果regex是(one)*one的话由于(one)*匹配了所有内容导致后面的one无法匹配,因而要退栈,返回到state3,再尝试匹配,这个时候全局就匹配成功了,你可以试验一下,这个时候的返回内容就是oNe了
这就是backtrace的大致原理,当然实际中还有各种优化,远比这个复杂
[ 本帖最后由 churchmice 于 2008-4-16 15:28 编辑 ] |
|