关于正则表达式中的 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
\@<=
\@<!
关于正则表达式中的 lookahead相关推荐
- 正则表达式中的非捕获组是什么?
非捕获组(即(?:) )如何在正则表达式中使用,它们有什么用? #1楼 在复杂的正则表达式中,您可能会希望使用大量的组,其中一些用于重复匹配,而另一些则提供反向引用. 默认情况下,与每个组匹配的文本会 ...
- “And” 在正则表达式中 ``
尝试使用正则表达式构建逻辑"与"运算时,我们有几种方法可以遵循. 第一种方法似乎很明显,但是如果考虑一下,默认情况下正则表达式是逻辑"和"的. 正则表达式中的每 ...
- 正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结
正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结_wl_ss的博客-CSDN博客 正则表达式中的*,+,?以及\w和\W的区别等常见问题的总结_wl_ss的博客-CSDN博客 正则表达式中 ...
- 小tips:JS之按位取反,语法标签label,正则表达式中replace的0,1是什么?
JS按位取反 Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算.如 ~1 = -2; ~2 = -3; 来看看~1的计算步骤: 将1(这里叫:原码)转二进制 = 000 ...
- 正则表达式中grep,sed的用法(包括基本的正则表达式和扩展的正则表达式)
一 正则表达式 Basic REGEXP:基本正则表达式 Extended REGEXP:扩展正则表达式 (正则表达式是使得计算机变成智能化的重要途径) 1.1 基本正则表达式 . : 表示匹配任 ...
- 定义一个圆类java用echo_正则表达式中圆括号的作用
圆括号在正则表达式中有着十分重要的作用. 在shell中的圆括号和正则中的圆括号是有区别的.在shell中圆括号意味着进程替换,比如 (var=1)表示在子shell(子进程)中创建变量var并赋值 ...
- 正则表达式中模式修正符作用详解(i、g、m、s、x、e)
正则表达式中常用的模式修正符有i.g.m.s.x.e等.它们之间可以组合搭配使用. 它们的作用如下: //修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或a ...
- Java 正则表达式中为什么反斜杠“\“需要用“\\\\”表示
正则表达式语法 在其他语言中,\\(两个斜杠) 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义. 在 Java 中,\\ (两个斜杠)表示:我要插入一个正则表达式 ...
- 正则表达式中的小括号用法
小括号中的连续字符作为可选: "Nov" -match "\bNov(ember)?\b" 返回true "November" -m ...
最新文章
- 2018年6月PMP考试小结-计划和执行收获知识和证书
- 爱晚红枫的博客配色----绿野仙踪
- 万字长文教你看懂java G1垃圾回收日志
- 二叉树的直径—leetcode543
- 学习动态性能表(19)--v$undostat
- OpenCV属性页配置问题~
- 容器映像_构建微小的容器映像
- linux内核IO模块plug/unplug机制
- PreparedStatement 防止 SQL 注入原理
- 华为eSight 监控AR系列路由器端口流量
- 关于计算机学院 公众号的名字,好听的公众号名称大全
- 三相全桥整流电路_三相全波整流电路原理?
- 平均值,标准差,方差,协方差,期望,均方误差
- mysql多进程模块型_mysql mysqld_multi 单机多进程
- 基于STM32MP1的IOT参考设计分享
- php技术逻辑思维图,PHP 逻辑思维题
- 组装一台计算机的配置,要不要自己动手组装一台电脑?一文告诉你答案!
- cat6 万兆_干货:CAT5E超五类、CAT6和CAT6A超六类布线系统性能和应用上的区别
- 机器人搭建记录 HoshinoBot
- 华为鸿蒙和yunos,阿里的YunOS跟华为的鸿蒙差距大么?
热门文章
- 掌门人共话根技术 | 麒麟信安高级副总裁陈松政参加2022长沙·中国1024程序员节“岳麓对话”
- Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了! | 博文精选...
- hopfileld神经网络_图卷积神经网络
- JAVA一些基础概念
- 项目经理面试中可能遇到的问题(持续更新)
- Python基础总结(一、二) 基础知识及流程控制
- 计算机屏幕纵向显示如何改,电脑桌面纵向怎么设置
- 优盘里文件夹变成html,U盘文件变成快捷方式怎么恢复?U盘里的文件变成快捷方式解决方法...
- iOS拍照识别车牌技
- Windows7+CentOS双系统同一硬盘