正则表达式的环视

环视的英文叫做lookaround,这是在“精通正则表达式”一书中的叫法。在不同的书籍跟文档中,它又被叫做“断言”,“前视”,“预搜索”等。环视分为以下几种。

顺序肯定环视。表示所在位置右侧能够匹配Expression。在python中为string(?=Expression),在vim中为/string\(Expression\)\@=

顺序否定环视。表示所在位置右侧能够匹配Expression。在python中为string(?!Expression),在vim中为/string\(Expression\)\@!

逆序肯定环视。表示所在位置左侧能够匹配Expression。在python中为string(?<=Expression),在vim中为/string\(Expression\)\@<=

逆序否定环视。表示所在位置左侧能够匹配Expression。在python中为string(?<!Expression),在vim中为/string\(Expression\)\@<!

在vim中使用very magic的话,则为/\vstring(Expression)@=(其它3种模式类似,都是去掉\即可),grep中使用-P,可以使用python模式

所在位置指的是string这个字符串中最后一个字符的右边。另外环视中Expression是不作为正则表示式的匹配结果输出的,Expression只是类似if中的判断语句,意思是在匹配string的情况下,满足(?=Expression)的话,则输出string。当然在正则表示式的规则下,Expression的右边也可以带有正则表达式的字符串,如string(?=Expression)string。此时,在匹配string的情况下,满足(?=Expression)的话,则输出stringstring。下面举个例子说明

print iamhere
print youarethere
print wheretheyare

上述文件命名为test.txt

使用grep -Po "print(?= iamhere)" test.txt。 则表示,在找到“print”字符串的情况下,从字符“t”的右边开始匹配“ iamhere”,如果匹配成功,则输出print

使用grep -Po "print(?= iamhere)" test.txt。 则表示,在找到“print”字符串的情况下,从字符“t”的右边开始匹配“ iamhere”,如果匹配不成功,则输出print

使用grep -Po "print(?= iamhere) \w+" test.txt。 则表示,在找到“print”字符串的情况下,从字符“t”的右边开始匹配“ iamhere”,如果匹配成功,则输出print \w+,输出结果为print iamhere

使用grep -Po "print(?! iamhere) \w+" test.txt。 则表示,在找到“print”字符串的情况下,从字符“t”的右边开始匹配“ iamhere”,如果匹配不成功,则输出print \w+,输出结果为print youarethere和print wheretheyare

使用grep -Po "print(?<! iamhere) \w+" test.txt。 则表示,在找到“print”字符串的情况下,从字符“p”的左边开始匹配“ iamhere”,如果匹配不成功,则输出print \w+,输出结果为print iamhere和print youarethere和print wheretheyare

其它情况类似,不一一举例子了。

时间: 2024-10-14 13:02:44

正则表达式的环视的相关文章

正则表达式的环视和匹配

环视 环视匹配的最终结果就是一个位置,有四种类型的环视: (?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression (?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression (?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression (?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression 可以用以下两个正则表达式理解环视: (1)字母.数字.特殊符号全部出现,至少

[正则表达式]PCRE环视功能

设想一下这个问题,假设为了方便长串数字的阅读性,需要为其添加逗号作为分隔,需要怎么做呢? 2569836495 => 2,569,836,495 正则表达式的匹配通常是从左往右的,这导致无法使用类似[\d]{3}这样的方法去解决问题,因为数字是从右边结算的 用s/([\d]{3})/$1,/g处理上面的数字,只会得到这样的结果 2569836495 => 256,983,649,5 显然这是错误的标记方法 幸好PCRE提供了[顺序环视],和[逆序环视]功能 [顺序环视]:(?=REG),例如(

正则表达式之环视(java)

下面我所写的都是参考自精通正则表达式(第三版). 什么是环视 环视顾名思义就是从四周看.正则表达式一向都是从左向右工作的,但是环视也能从右向左工作.最典型的列子就是给你一个数字如 12345678,需要你改成12,345,678这种格式.如果按照我们的思维来,应该是会从右边开始划分吧,每三个数字加一个逗号.环视就能按照我们的思维去解决这样的问题.这里要注意的是环视不匹配任何字符,只是匹配位置而已.作用和^,&相似.环视又分为顺序环视和逆序环视.也就是从左到右工作和从右到左的区别.顺序环视在正则中

js 正则表达式之环视结构

一.环视 1:环视不"占用"字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正则匹配,黄色表示断言匹配 (1):起始位为0 (2):从左向右查看文本,如果当前位置字符与表达式2匹配成功,就查看右侧文本是否满足断言条件,当条件1与条件2都成立时就匹配成功. 三.肯定逆向环视(?<=...) 子表达式匹配当前位置的左侧字符 图中:红色表示当前位置,绿色表示正则匹配

深入理解正则表达式环视的概念与用法

在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的概念与用法 一.环视的概念 (一)环视概念与匹配过程示例 示例一:简单环视匹配过程 (二)什么是消耗正则的匹配字符? 示例二:一次匹配消耗匹配字符匹配过程 示例三:多次匹配消耗匹配字符匹配过程 二.环视的类型 (一)肯定和否定 (二)顺序和逆序 · 两种类型名称组合 · 四种组合的用法 四种组合正则与环视的摆

《精通正则表达式》

许多种工具都支持正则表达式(文本编辑器.文字处理软件.系统工具.数据库引擎等), 不过,要想充分挖掘正则表达式的能力,还是应当将它作为编程语言的一部分.例如Java, JScript,Visual Basic,VBScript,JavaScript,ECMAScript,C,C++,C#,elisp,Perl,Python, Tcl,Ruby,PHP,sed和awk. 正则表达式regular expression是强大,便捷,高效的文本处理工具.正则表达式本身, 加上如同一门袖珍编程语言的通用

巧解正则表达式环视

正则表达式匹配主要有两种,匹配字符和匹配位置.环视我个人理解应该更像是匹配位置的.具体下文说到.下面先看一下环视的正则表达式书写格式. 类型 正则表达式 匹配成功条件 肯定逆序环视 (?<=expresion) 子表达式能够匹配左侧文本 否定逆序环视 (?<!expresion) 子表达式不能匹配左侧文本 肯定顺序环视 (?=expresion) 子表达式能够匹配右侧文本 否定顺序环视 (?!expresion) 字表达式不能匹配右侧文本 本表摘自<精通正则表达式>p66 你要是觉

正则表达式(四)——位置匹配(环视、单词分界符、锚点)

这次的内容是有关于正则表达式中的位置匹配,它包含的内容有两部分,一部分是较为简单的锚点和单词分界符,一部分是较为复杂的零宽断言.复杂有复杂的好处,写起来复杂,能匹配的位置也就越复杂.零宽断言又可以叫做环视.这一部分是重点内容. 锚点 标准的锚点有这么几个,它们是^,$.在普遍的,不涉及任何模式的情况下,脱字符(^)匹配的是文本的起始位置.而$匹配的则是文本末尾的换行符\n之前的位置.举个例子 正则表达式:s$ 上面这个正则表达式的意思就是匹配以字符[s]结尾的行,即[······s/n]这样的字

正则表达式入门(八)环视

环视是一种非捕获分组,它根据某个模式之前或之后的内容匹配其他模式.环视也称为零宽度断言. 环视包括: 正前瞻 反前瞻 正后顾 反后顾 正前瞻假设要匹配单词ancyent,且要求紧跟的单词是marinere,可以使用正前瞻.