简析正则中的环视

前端之家收集整理的这篇文章主要介绍了简析正则中的环视前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

网上有关于环视的解释,有些写的很长,很佩服这些这么耐心解释正则环视的大神(绝无讽刺之意),

但是我实在没有太多的耐心把这些内容看完,在此深深的鄙视下自己^-^


在此分享下我对正则环视的理解:

环视的作用:确定一个位置

下面看下一个从ifconfig中过滤ip地址的例子(获取下面红色标注的IP)

[root]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:69954 errors:0 dropped:0 overruns:0 frame:0
TX packets:69954 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5139078 (4.9 MiB) TX bytes:5139078 (4.9 MiB)

p4p1 Link encap:Ethernet HWaddr A4:1F:72:79:0C:8D
inet addr:10.84.22.21 Bcast:10.84.22.255 Mask:255.255.255.0
inet6 addr: fe80::a61f:72ff:fe79:c8d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:121702347 errors:0 dropped:0 overruns:0 frame:0
TX packets:133507811 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:42562340126 (39.6 GiB) TX bytes:58317218304 (54.3 GiB)

方式1:ifconfig | grep -oP "[0-9]{1,3}\.[0-9]{1,3}"

只看这个正则就感觉比较“笨”,呵呵!这样的结果如下,但是不精确。

127.0.0.1
255.0.0.0
10.84.22.21
10.84.22.255
255.255.255.0

最后还要过滤下,只显示我们需要的两个IP,ifconfig |grep -oP "[0-9]{1,3}" | sed -n '1p;3p'


方式2:看下上面ifconfig显示内容,我们就很容易发现两个IP前都有一个字串“inet addr:

如果使用一种方法把要匹配的位置指定到“inet addr:”后面就好了,这时我们就可以用到正则的环视了...环视的使用场景就是这样...

现在我们重新写下这个语句:ifconfig | grep -oP "(?<=inet addr:)[0-9\.]+";这个黑色高亮的部分就是逆序环视了

所谓环视,就是找位置,顺序环视是找字串左面的位置,逆序环视是确定字串右面的位置,那上面的逆序环视确定的位置就是从“inet addr:”开始了...

上面语句就是匹配从“inet addr:”后面开始,由数字和“.”组成的字串,那就是要找的IP了。

执行结果是:[root]# ifconfig | grep -oP "(?<=inet addr:)[0-9\.]+"
127.0.0.1
10.84.22.21

方式3:如果我们只想要IP:10.84.22.21

我们很容易发现,这个IP是在字串“inet addr:”和“ Bcast”之间的,修改下上面的语句为:

ifconfig | grep -oP "(?<=inet addr:).*(?= Bcast)"

执行结果就是我们想要的IP:10.84.22.21

我们在语句中又加了一个括号,目的就是要再确认一个位置,这个位置就是要定做“Bcast”左面,这个括号中的内容就是顺序环视了

一个逆序环视指定边界从表达式的右边开始(我们想要的IP的左边界),

并上一个顺序环视,指定一个结束位置是到表达式的左边(确定了IP的右边界),那么IP的位置就确认了,表达式“.*”就能匹配到这个IP的内容


总结下,上面说的都是肯定环视,就是匹配到表达式后做的操作,具体的格式如下:

(?<=Expression)


(?<=Expression)

逆序肯定环视,表示所在位置左侧能够匹配Expression

(?=Expression)

顺序肯定环视,表示所在位置右侧能够匹配Expression


否定环视的格式如下:

(?<!Expression)

逆序否定环视,表示所在位置左侧不能匹配(?!Expression)

顺序否定环视,表示所在位置右侧不能匹配Expression

由于否定的逆序的应用场景我还没有遇到,在这里就不举例了,但是原理应该和上述的类似...

猜你在找的正则表达式相关文章