- 论坛徽章:
- 0
|
看了mwm5提供的<<精通正则表达式>>3 4 5章和perlre, perlop. 疑问之处基本想通了.
对于\G, 他和^, $一样, 他在正则表达式中虽然不匹配任何字符, 但是要匹配一个位置. 所以写成#\G//#其实是说: 自上次匹配结束的位置后紧跟两个/.
相当于在$'上使用#^//#.
而我之前错误地以为, 使用\G会把引擎执行匹配动作的起始位置定在上次匹配结束之后, 然后用\G后面的模式匹配剩余的串 (区别在于: \G自身是要匹配上一个位置, 而不是指示引擎从这里来开始匹配).
对于之前提到的: 想在上次匹配剩余的串中进行模式匹配, 而模式不是一开始就匹配得上, 用\G是不行的.(perl好像不直接提供这样的支持, 你需要使用/gc慢慢地挪到你想要的模式前面)
受启发于黑哥的 s#\G//#/# while m#/[^/]+#g;
我有个更快些的 s#\G//#/# while m#//[^/]+/?[^/]+#gc;
再次感谢黑哥, 以及感谢mwm5提供不全(1,3,4,5章)但相当够用的<<精通正则表达式>>(中文版)
[ 本帖最后由 wind_ch 于 2010-1-8 16:46 编辑 ] |
|