简析正则中的环视

来源:互联网 发布:脸部皮肤粗糙 知乎 编辑:程序博客网 时间:2024/06/05 02:34

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

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


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

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

下面看下一个从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}\.[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}\.[0-9]{1,3}\.[0-9]{1,3}\.[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)

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

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

0 0
原创粉丝点击