『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"
/*为节省时间,本文以汉文撰写*/
~前言~
深入学习正则表达式,可以很好的提高思维逻辑的缜密性;又因正则应用于几乎所有高级编程语言,其重要性不言而喻,是江湖人士必备的内功心法。
正则表达式概要(object:PCRE)
「一」匹配方向
- 横向视图,即按行:从左至右
- 纵向视图,即按列:自上而下
「二」基本匹配位移单位
默认以单个字符为基本位移单位;可通过\b“contents”\b格式指定按“连续字符串”为基本单位进行逐位匹配,\b\b的边界定义可以为blank-空格、Tab制表符、\n-Linux换行符、\r-MS回车符或标点符号
「三」匹配范围
默认贪婪特性,即匹配符合条件的最大范围;可在量词后追加一个“?”转换为懒惰模式
~正题~ Zero-Length Assertions
中文通常译作“零宽断言”,起源于Perl5,very powerful and flexible!为便于理解,可将其与^$\b等归为一类,即:不实际占用任何字符位的虚拟分界线,英文名称即包含“Zero-Length”!
按其相对匹配目标的位移方向,可分为Lookahead和Lookbehind,按其匹配逻辑取向(True/False),又分为positive和negative
即:
- Positive Lookahead Zero-Length Assertions正逻辑向前位移零宽断言——按基本位移单位逐个查找符合条件的目标,然后在目标之前标记虚拟分界线;表达式(?=exp)
- Positive Lookbehind Zero-Length Assertions正逻辑向后位移零宽断言——按基本位移单位逐个查找符合条件的目标,然后在目标之后标记虚拟分界线;表达式(?<=exp)向后位移零宽断言,其“exp”不能包含如{1,}*+等量词以及(ab)|(bcde)等形式
- Negative Lookahead Zero-Length Assertions负逻辑向前位移零宽断言——按基本位移单位逐个查找不符合条件的目标,然后在目标之前标记虚拟分界线;表达式(?!exp)
- Negative Lookbehind Zero-Length Assertions负逻辑向后位移零宽断言——按基本位移单位逐个查找不符合条件的目标,然后在目标之后标记虚拟分界线;表达式(?<!exp)向后位移零宽断言,其“exp”不能包含如{3,100}+*等量化单位或(\d)|(\s\w)等表达式
特别注意:Zero-Length Assertions中的匹配条件“exp”仅仅用于确定“虚似分界线”的位置,并不选中或排除任何字符,其意义是缩小匹配范围;最终匹配出的结果是由零宽表达式之外的条件确定的。
如下以“ip addr”的输出为示例分类讲解
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ brd 127.255.255.255 scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :8d:5c:e2::2f brd ff:ff:ff:ff:ff:ff
inet 172.18.21.244/ brd 172.18.21.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::428d:5cff:fee2:872f/ scope link
valid_lft forever preferred_lft forever
实验一:提取所有端口的名称及其MTU值
f@z ~ $ ip addr | grep -oP '(\w+(?=:+\s+<+))|(?<=\smtu\s)\d+'
lo eth0
实验二「00」:排除“ip addr”输出结果中含有“lft”的行
f@z ~ $ ip addr | grep -oP '^(?!.*lft).*$'
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ brd 127.255.255.255 scope host lo
inet6 ::/ scope host
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :8d:5c:e2::2f brd ff:ff:ff:ff:ff:ff
inet 172.18.21.244/ brd 172.18.21.255 scope global eth0
inet6 fe80::428d:5cff:fee2:872f/ scope link
实验二「01」:错误演示
f@z ~ $ ip addr | grep -oP '(?!.*lft).*'
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ brd 127.255.255.255 scope host lo
ft forever
inet6 ::/ scope host
ft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :8d:5c:e2::2f brd ff:ff:ff:ff:ff:ff
inet 172.18.21.244/ brd 172.18.21.255 scope global eth0
ft forever
inet6 fe80::428d:5cff:fee2:872f/ scope link
ft forever
f@z ~ $ ip addr | grep -oP '\b(?!.*lft).*\b'
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ brd 127.255.255.255 scope host lo
forever
inet6 ::/ scope host
forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :8d:5c:e2::2f brd ff:ff:ff:ff:ff:ff
inet 172.18.21.244/ brd 172.18.21.255 scope global eth0
forever
inet6 fe80::428d:5cff:fee2:872f/ scope link
forever
错误解析:必须“^$”限定基本位移单位为整行,方能达成任意一次匹配结果为false时,即判定排除整行的目的。
REFERENCE:
http://www.regular-expressions.info/lookaround.html
最新文章
- redis 简单应用
- ARPSpoofing教程(三) - 捕获数据包
- vbox进行克隆时时启动eth0时问题
- [转]安装openoffice,并且配置为windows服务
- 浅谈iOS的Autolayout
- POJ Wormholes (SPFA)
- mac usb转串口 连接树莓PI
- POJ 1740 A New Stone Game(多堆博弈找规律)
- 设置UITabBarController上ImageInsets后点击不断缩小
- 为ubuntu添加右键打开终端效果
- 华为oj之字符串反转
- eclipse自动编译
- Netty入门(六)Decoder(解码器)
- 最新小程序教学视频,欢迎加小程序交流群免费获取(微信小程序开发(交流QQ群:604788754)
- push(),pop(),unshift(),shift()
- datagrid在MVC中的运用09-实现排序
- Python学习---基础函数的学习
- CVE-2016-3231
- bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法
- DirectX 读书笔记(14) Cube mapping之SkyBox[转]
热门文章
- firefox显示 您的连接不安全 解决办法
- 关于“Unknown or unsupported command &#39;install&#39;”问题解决的小结
- FastJson乱序问题
- python 调用redis
- Centos7.4安装elasticsearch6.3+kibana6.3集群
- Vmware ESXi安装群晖Synology DSM 5.x
- 5. Python数据类型之元组、集合、字典
- python 实现异常退出
- python语言和R语言实现机器学习算法
- 关于windows cmd的一些便捷应用