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

栏目: Perl · 发布时间: 6年前

内容简介:老男孩带你了解perl正则表达式中的零宽断言

1.1  前言

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

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

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

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

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

名字

表达式

如果子表达式成功则

positive lookahead

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

(?=subexp)

如果匹配到右边则成功

negative lookahead

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

(?!subexp)

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

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

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

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

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

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

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

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

名字

表达式

如果子表达式成功则

positive lookbehind

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

(?<=subexp)

如果匹配到左边则成功

negative lookbehind

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

(?<!subexp)

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

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

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

1.4  lookahead lookbehind 区别

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

如图所示 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地址

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

[root@node1 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(正常向前看,零宽度正预测先行断言)

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

192.168.85.50

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

192.168.85.50  

说明:

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

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

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

[root@node1 oldboy]# ifconfig eth0 | grep -oP '(?<=\baddr:)[\d.]+'

192.168.85.50

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

[root@node1 oldboy]# ifconfig eth0|grep -oP 'addr:[\d\.]+(?![\d\.])'

addr:192.168.85.50

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

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<=addr:)[\d\.]+(?![\d\.])'

192.168.85.50

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

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<![\d\.])[\d\.]+(?)  Bca'

192.168.85.50  Bca

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

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<![\d\.])[\d\.]+(?)(?=  Bca)'

192.168.85.50  

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

How to Design Programs, 2nd Edition

How to Design Programs, 2nd Edition

Matthias Felleisen、Robert Bruce Findler、Matthew Flatt、Shriram Krishnamurthi / MIT Press / 2018-5-4 / USD 57.00

A completely revised edition, offering new design recipes for interactive programs and support for images as plain values, testing, event-driven programming, and even distributed programming. This ......一起来看看 《How to Design Programs, 2nd Edition》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具