老男孩带你了解perl正则表达式中的零宽断言

老男孩IT教育小编为大家整理了perl正则表达式中的零宽断言的方法,希望能帮到大家

1.1 前言

本文只介绍perl语言正则表达式的零宽断言功能。

零宽断言实质:匹配文本里面的位置。

零宽断言叫zero-length assertions,也叫lookaround(这个更容易理解)。

包括:lookahead(向前看,零宽度正预测先行断言),lookbehind(向后看,零宽度正回顾后发断言)。

从左到右对文本进行匹配,判断是否符合exp表达式。


名字


表达式


如果子表达式成功则…


positive lookahead

(零宽度正预测先行断言)


(?=subexp)


如果匹配到右边则成功


negative lookahead

(零宽度负预测先行断言)


(?!subexp)


如果没有匹配到右边则成功

注:成功就是找到对应的位置

1.2 lookahead 向前看-找到匹配内容前面的位置

  如图所示:首先这个是lookahead(向前看)他匹配exp这个词(oldboy)之前的一个位置,同时是 positive lookahead是表示匹配到exp就成功的意思。

注:先理解lookahead的含义。然后对比理解positive lookahead和negative lookahead的区别。

1.3 lookbehind 向后看,找到匹配内容的后面的位置

lookbehind(向后看),从右向左匹配,判断是否符合exp表达式。


名字


表达式


如果子表达式成功则…


positive lookbehind

(零宽度正回顾后发断言)


(?<=subexp)


如果匹配到左边则成功


negative lookbehind

(零宽度负回顾后发断言)


(?<!subexp)


如果没有匹配到左边则成功

#注:成功就是找到对应的位置

1.4 lookahead 与lookbehind区别

如图所示lookahead匹配的位置是在subexp之前,lookbehind匹配的位置是在subexp之后。

1.5 perl常用的转义字符


转义字符


含义


\b


单词的边界。


\w


表示[a-zA-Z0-9_]中任意一个字符


\W


与\w相反表示不在[a-zA-Z0-9_]中的任意字符


\d


[0-9]中的一个数字


\D


不在[0-9]中的任意字符

1.6 案例1:实战演示:取IP地址

基本格式,红色就是我们的目标。

[[email protected] oldboy]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:3A:C5:88

inet addr:192.168.85.50  Bcast:192.168.85.255  Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe3a:c588/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:81923 errors:0 dropped:0 overruns:0 frame:0

TX packets:26480 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:96099065 (91.6 MiB)  TX bytes:3459424 (3.2 MiB)

方法一:使用positive lookahead(正常向前看,零宽度正预测先行断言)

[[email protected] oldboy]# ifconfig eth0 | grep -oP "[0-9.]+(?=  Bcast)"

192.168.85.50

[[email protected] oldboy]# ifconfig eth0 | grep -oP "[\d.]+(?=  Bcast)"

192.168.85.50 

说明:

1.这里使用lookahead的时候要注意,Bcast前面有两个空格,匹配时要注意他们。

2.前面已经说过,\d è[0-9]

方法二:使用positive lookbehind(正常向后看,零宽度正回顾后发断言)

[[email protected] oldboy]# ifconfig eth0 | grep -oP ‘(?<=\baddr:)[\d.]+‘

192.168.85.50

方法三:使用零宽度负预测先行断言

[[email protected] oldboy]# ifconfig eth0|grep -oP ‘addr:[\d\.]+(?![\d\.])‘

addr:192.168.85.50

但是去掉"addr:"还是需要使用lookbehind(向后看,零宽度正回顾后发断言)

[[email protected] oldboy]# ifconfig eth0|grep -oP ‘(?<=addr:)[\d\.]+(?![\d\.])‘

192.168.85.50

方法四:使用零宽度负向回顾后发断言

[[email protected] oldboy]# ifconfig eth0|grep -oP ‘(?<![\d\.])[\d\.]+(?)  Bca‘

192.168.85.50  Bca

但是后面的去除需要使用使用零宽度正预测先行断言

[[email protected] oldboy]# ifconfig eth0|grep -oP ‘(?<![\d\.])[\d\.]+(?)(?=  Bca)‘

192.168.85.50 

更多精彩请关注老男孩linux培训

时间: 2024-12-24 21:30:02

老男孩带你了解perl正则表达式中的零宽断言的相关文章

&lt;摘录&gt;perl正则表达式中的元字符、转义字符、量词及匹配方式

Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元字符(Meta-character) '\' : 在任何元字符前面加上反斜线,就会使它失去元字符的特殊作用.例如/3\.1415/这个模式里没有通配符 '^' : 匹配行首:在字符集中它是脱字符,表示求补集 '$' : 匹配行尾(或结尾处新行之前字符) '.' : 除新行(newline)外的任一字

正则表达式的零宽断言

零宽断言,大多地方这样定义它,用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< > 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言.我的理解是在一个限定位置的字符串之前或之后进行匹配查找.所以零宽断言,执行过程分两种情况,如果是正向断言,应该是这样的,第一步,判断判断断言是否为真(即是否满足一定条件)第二步,如果满足条件,则进行下一步查找匹配.如果是反向断言,第一步还是按照正则表达式顺序去匹配.第二步

正则表达式(二) - 零宽断言与懒惰匹配以及平衡组

小括号的作用 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp)   匹配exp,不捕获匹配的文本,也不给此分组分配组号 零宽断言 (?=exp) 匹配exp前面的位置 (?<=exp)  匹配exp后面的位置 (?!exp)  匹配后面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置 注释 (?#comment)

正则表达式–零宽断言-赵兴壮

零宽断言的意思是(匹配宽度为零,满足一定的条件/断言) 我也不知道这个词语是谁发明的,简直是太拗口了. 零宽断言用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言. 断言用来声明一个应该为真的事实.正则表达式中只有当断言为真时才会继续进行匹配. 其中零宽断言又分四种 先行断言   也叫零宽度正预测先行断言(?=表达式)          表示匹配表达式前面的位置 例如 [a-z]

正则表达式-零宽断言

[toc] 一.零宽断言-介绍 零宽断言,它匹配的内容不会提取,其作用是在一个限定位置的字符串向前或向后进行匹配查找. 1.1.应用场景 排除查找,查找不含有某段字符串的行 包含查找,查找含有某段字符串的行 二.断言的分类 2.1.正先行断言 什么是正先行断言,就是在字符串相应位置之前进行查找匹配,使用 (?=exp) 匹配exp前面的位置. import re str = 'abcgwcab' pattern = 'bc(?=gw)' result = re.search(pattern,st

JS不支持正则中的负向零宽断言

今天在项目中用到了正则表达式,并且需要用负向零宽断言 (?<=exp) 进行筛选,结果运行时报 Invalid group 错,一开始以为是自己很久没用表达式写错了,查阅了一下正则语法后发现并没有写错. 到网上一搜才发现,JS不支持负向的 (?<=exp) 和 (?<!exp),只支持正向的(?=exp) 和 (?!exp).

正则表达式 零宽断言 负向零宽断言 平衡组/递归匹配

零宽断言 用于查找在某些内容(但并不包括这些内容)之前或之后的东西,像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言. (?<=exp)myexp(?=exp1) 负向零宽断言 与零宽断言类似 (?<!exp)myexp(?!exp1) 自己用上面的例子测试下 (?<=<(\w+)>).*(?=<\/\1>) 平衡组/递归匹配 这个看起来有点复杂,其实就是 push/pop. 这里很像编程语言,或者说像个语法分析器

正则表达式学习3-负向零宽断言

负向零宽断言 (?!表达式) 也是匹配一个零宽度的位置,不过这个位置的"断言"取表达式的反值,例如 (?!表达式) 表示 表达式 前面的位置,如果 表达式 不成立 ,匹配这个位置:如果 表达式 成立,则不匹配 待续.......

零宽断言正则表达式

"(?=exp)"  匹配exp前面的位置 如 "How are you doing" 正则"(.+(?=ing))" 这里取ing前所有的字符,值为"How are you do"; "(?<=exp)"  匹配exp后面的位置 如 "How are you doing" 正则"((?<=How).+)" 这里取"How"之后所有的字