关于正则表达式中的 lookahead

(参考了这个文章:http://www.regular-expressions.info/lookaround.html, 英文的,呵呵)

(适合Perl,Sublime,Boost library)

我们举例子来看,有下面三行文本

quit

qut

qing

 

要解决的问题

1) 找字母q,但是后面没有跟着u

2)找字母q,后面跟着u

分别用如下表达式:

1)  q(?!u)

2)  q(?=u)

解释:

1)第一种是negative lookahead,格式为(?!表达式)  , 其中q是一般字母,没有特殊含义。(? )构成lookahead基本语法,!(感叹号)用来表示否定的。

2) 第二种是positive lookahead,格式为(?=表达式),(? )构成lookahead基本语法,=(等于号)用来表示肯定的。

 

有个例子可以用来加深学习的,有如下一行文本用来搜索:

quit

问题:用 q(?!u)it来搜,能搜到吗?

答案:搜不到。

因为:      (?!u)是lookahead,不是真正消耗一个字符位置的,比较的过程如下:

1)在第1位置,字母q与表达式匹配第一个字母

2)看第2个位置,字母u与表达式的u匹配,但是,因为是!(negative lookahead),所以,lookahead失败

3)从第2个位置,u与要搜索的q不匹配

4)从第3个位置,i与要搜索的q不匹配

5)从第4个位置,t与要搜索的q不匹配

所以,最终结果没有搜到匹配的。

 

(VIM, VI中格式稍有不同,接下来简要说明其格式):

(参考了这个链接   http://stackoverflow.com/questions/18391665/vim-positive-lookahead-regex )

qu\@=    positive lookahead

qu\@!     negative lookahead

 

如果要lookahead的是多个字母,则需要用()括起来后再接\@=或者\@!,注意,因为 () 不是特殊字符(metacharacter),所以需要\来转义为特殊字符,因此以上的例子也可以写为:

q\(u\)\@=

q\(u\)\@!

 

 

在VIM中,除了上面的表达方法外,还有\ze

\ze   是查找后面的匹配,匹配后把匹配的结束点设置在后面匹配字符串的开始处(即后面的匹配被抛弃了,只保留前面的匹配),则相当于\@=        。

例如:

q\zeu,与这个表达式功能一样  q\(u\)\@=

有细微差别,\ze是把匹配的结束点确定了,所以,在\ze匹配表达式后面就不能再跟其他表达式了(否则会查不到)

hello

 

用he\@=e能得到he

用h\(\zee\)e则得不到he

 

(以后详细补充)

lookbehind in VIM

 

\@<=
\@<!

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值