免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 9076 | 回复: 31
打印 上一主题 下一主题

[学习共享] 学习分享--正则中的环视 [复制链接]

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-18 17:00 |只看该作者 |倒序浏览
本帖最后由 jeffreyst 于 2014-04-18 17:15 编辑

网上有关于环视的解释,有些写的很长,很佩服这些这么耐心解释正则环视的大神(绝无讽刺之意),
但是我实在没有太多的耐心把这些内容看完,在此深深的鄙视下自己^-^

在此分享下我对正则环视的理解,在下也是初学,说的不好或者不对的地方,请各位大神指正,多谢!

环视的作用:确定一个位置
下面看下一个从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
由于否定的逆序的应用场景我还没有遇到,在这里就不举例了,但是原理应该和上述的类似...

评分

参与人数 2可用积分 +15 收起 理由
expert1 + 5 很给力!
Shell_HAT + 10 赞一个!

查看全部评分

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
2 [报告]
发表于 2014-04-18 17:02 |只看该作者
自己先顶下
顺便问下,帖子中的表情怎么去掉?

论坛徽章:
6
摩羯座
日期:2013-12-27 09:45:04技术图书徽章
日期:2014-01-27 12:40:06辰龙
日期:2014-02-28 15:12:52巳蛇
日期:2014-03-21 17:06:27未羊
日期:2014-04-15 20:12:41黑曼巴
日期:2016-08-02 11:00:06
3 [报告]
发表于 2014-04-18 17:03 |只看该作者
禁用表情{:3_182:}

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2014-04-18 17:04 |只看该作者
Nice work!

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
5 [报告]
发表于 2014-04-18 17:10 |只看该作者
本帖最后由 jeffreyst 于 2014-04-18 17:11 编辑

回复 3# laliheyi

   
    那个表情对应的字符是“:”和“)”
   在下愚钝,该如何修改,麻烦具体说下,多谢!

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2014-04-18 17:13 |只看该作者
回复 5# jeffreyst


    顶楼那个帖子,点击“编辑”,勾选右侧的“禁用表情”

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
7 [报告]
发表于 2014-04-18 17:20 |只看该作者
回复 6# Shell_HAT


    搞定,多谢HAT哥,上次看到大神用环视,一直很纠结怎么用,今天发奋研究了下...
    把研究成果发了出来,请大家帮忙看看有没有什么地方理解的不正确...献丑了!

论坛徽章:
0
8 [报告]
发表于 2014-04-18 18:00 |只看该作者
不错..........

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2014-04-18 18:10 |只看该作者
回复 1# jeffreyst


    总结就有进步,好!

论坛徽章:
0
10 [报告]
发表于 2014-04-18 18:36 |只看该作者
好像比零宽断言好听~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP