(参考了这个文章: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

\@<=
\@<!

关于正则表达式中的 lookahead相关推荐

  1. 正则表达式中的非捕获组是什么?

    非捕获组(即(?:) )如何在正则表达式中使用,它们有什么用? #1楼 在复杂的正则表达式中,您可能会希望使用大量的组,其中一些用于重复匹配,而另一些则提供反向引用. 默认情况下,与每个组匹配的文本会 ...

  2. “And” 在正则表达式中 ``

    尝试使用正则表达式构建逻辑"与"运算时,我们有几种方法可以遵循. 第一种方法似乎很明显,但是如果考虑一下,默认情况下正则表达式是逻辑"和"的. 正则表达式中的每 ...

  3. 正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结

    正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结_wl_ss的博客-CSDN博客 正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结_wl_ss的博客-CSDN博客 正则表达式中 ...

  4. 小tips:JS之按位取反,语法标签label,正则表达式中replace的0,1是什么?

    JS按位取反 Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算.如 ~1 = -2; ~2 = -3; 来看看~1的计算步骤: 将1(这里叫:原码)转二进制 = 000 ...

  5. 正则表达式中grep,sed的用法(包括基本的正则表达式和扩展的正则表达式)

    一 正则表达式   Basic REGEXP:基本正则表达式 Extended REGEXP:扩展正则表达式 (正则表达式是使得计算机变成智能化的重要途径) 1.1 基本正则表达式 . : 表示匹配任 ...

  6. 定义一个圆类java用echo_正则表达式中圆括号的作用

    圆括号在正则表达式中有着十分重要的作用. 在shell中的圆括号和正则中的圆括号是有区别的.在shell中圆括号意味着进程替换,比如  (var=1)表示在子shell(子进程)中创建变量var并赋值 ...

  7. 正则表达式中模式修正符作用详解(i、g、m、s、x、e)

    正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...

  8. Java 正则表达式中为什么反斜杠“\“需要用“\\\\”表示

    正则表达式语法 在其他语言中,\\(两个斜杠) 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义. 在 Java 中,\\ (两个斜杠)表示:我要插入一个正则表达式 ...

  9. 正则表达式中的小括号用法

    小括号中的连续字符作为可选: "Nov" -match "\bNov(ember)?\b"  返回true    "November" -m ...

最新文章

  1. 2018年6月PMP考试小结-计划和执行收获知识和证书
  2. 爱晚红枫的博客配色----绿野仙踪
  3. 万字长文教你看懂java G1垃圾回收日志
  4. 二叉树的直径—leetcode543
  5. 学习动态性能表(19)--v$undostat
  6. OpenCV属性页配置问题~
  7. 容器映像_构建微小的容器映像
  8. linux内核IO模块plug/unplug机制
  9. PreparedStatement 防止 SQL 注入原理
  10. 华为eSight 监控AR系列路由器端口流量
  11. 关于计算机学院 公众号的名字,好听的公众号名称大全
  12. 三相全桥整流电路_三相全波整流电路原理?
  13. 平均值,标准差,方差,协方差,期望,均方误差
  14. mysql多进程模块型_mysql mysqld_multi 单机多进程
  15. 基于STM32MP1的IOT参考设计分享
  16. php技术逻辑思维图,PHP 逻辑思维题
  17. 组装一台计算机的配置,要不要自己动手组装一台电脑?一文告诉你答案!
  18. cat6 万兆_干货:CAT5E超五类、CAT6和CAT6A超六类布线系统性能和应用上的区别
  19. 机器人搭建记录 HoshinoBot
  20. 华为鸿蒙和yunos,阿里的YunOS跟华为的鸿蒙差距大么?

热门文章

  1. 掌门人共话根技术 | 麒麟信安高级副总裁陈松政参加2022长沙·中国1024程序员节“岳麓对话”
  2. Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...
  3. hopfileld神经网络_图卷积神经网络
  4. JAVA一些基础概念
  5. 项目经理面试中可能遇到的问题(持续更新)
  6. Python基础总结(一、二) 基础知识及流程控制
  7. 计算机屏幕纵向显示如何改,电脑桌面纵向怎么设置
  8. 优盘里文件夹变成html,U盘文件变成快捷方式怎么恢复?U盘里的文件变成快捷方式解决方法...
  9. iOS拍照识别车牌技
  10. Windows7+CentOS双系统同一硬盘