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”的输出为示例分类讲解


1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 40:8d:5c:e2:87:2f brd ff:ff:ff:ff:ff:ff
    inet 172.18.21.244/24 brd 172.18.21.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::428d:5cff:fee2:872f/64 scope link
       valid_lft forever preferred_lft forever

实验一:提取所有端口的名称及其MTU值

[email protected] ~ $ ip addr | grep -oP ‘(\w+(?=:+\s+<+))|(?<=\smtu\s)\d+‘
lo
65536
eth0
1500

实验二「00」:排除“ip addr”输出结果中含有“lft”的行

[email protected] ~ $ ip addr | grep -oP ‘^(?!.*lft).*$‘
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    inet6 ::1/128 scope host
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 40:8d:5c:e2:87:2f brd ff:ff:ff:ff:ff:ff
    inet 172.18.21.244/24 brd 172.18.21.255 scope global eth0
    inet6 fe80::428d:5cff:fee2:872f/64 scope link 

实验二「01」:错误演示

[email protected] ~ $ ip addr | grep -oP ‘(?!.*lft).*‘
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
ft forever
    inet6 ::1/128 scope host
ft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 40:8d:5c:e2:87:2f brd ff:ff:ff:ff:ff:ff
    inet 172.18.21.244/24 brd 172.18.21.255 scope global eth0
ft forever
    inet6 fe80::428d:5cff:fee2:872f/64 scope link
ft forever
[email protected] ~ $ ip addr | grep -oP ‘\b(?!.*lft).*\b‘
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
 forever
inet6 ::1/128 scope host
 forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 40:8d:5c:e2:87:2f brd ff:ff:ff:ff:ff:ff
inet 172.18.21.244/24 brd 172.18.21.255 scope global eth0
 forever
inet6 fe80::428d:5cff:fee2:872f/64 scope link
 forever
 错误解析:必须“^$”限定基本位移单位为整行,方能达成任意一次匹配结果为false时,即判定排除整行的目的。

REFERENCE: 

http://www.regular-expressions.info/lookaround.html

Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"

时间: 2024-10-27 12:37:33

Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"的相关文章

正则表达式高级2.1

什么是RE?  想必各位大大在做文件查找的时侯都有使用过万用字符”*”,比如说想查找在Windows目录下所有的Word文件时,你可能就会用”*.doc”这样的方式来做查找,因为”*”所代表的是任意的字符.RE所做的就是类似这样的功能,但其功能更为强大. 写程序时,常需要比对字符串是否符合特定样式,RE最主要的功能就是来描述这特定的样式,因此可以将RE视为特定样式的描述式,举个例子来说,”\w+”所代表的就是任何字母与数字所组成的非空字符串(non-null string).在.NET fram

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

老男孩IT教育小编为大家整理了perl正则表达式中的零宽断言的方法,希望能帮到大家 1.1 前言 本文只介绍perl语言正则表达式的零宽断言功能. 零宽断言实质:匹配文本里面的位置. 零宽断言叫zero-length assertions,也叫lookaround(这个更容易理解). 包括:lookahead(向前看,零宽度正预测先行断言),lookbehind(向后看,零宽度正回顾后发断言). 从左到右对文本进行匹配,判断是否符合exp表达式. 名字 表达式 如果子表达式成功则- positi

PCRE Perl Compatible Regular Expressions Learning

catalog 1. PCRE Introduction 2. pcre2api 3. pcre2jit 4. PCRE Programing 1. PCRE Introduction The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own nat

Java String.replaceAll() 与后向引用(backreference)

问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "*",则保留该 "*". 举几个例子(箭头左边为输入,箭头右边为输出): * --> * ** --> ** **** --> ** *ab**de** --> *abde* 我觉得应该用正则表达式来处理,但想不出正则表达式该怎么写. 第一种解答 该博文的回

正则表达式学习(转)

http://www.codeceo.com/article/you-should-learn-regex.html Regular Expressions (Regex):正则表达式,软件工程中最为强大,且广泛适用,令人信服的技术之一.从验证电子邮件地址到执行复杂的代码重构器,正则表达式的用途非常广泛,是任何软件工程师工具箱中必不可少的条目. 什么是正则表达式? 正则表达式(或Regex,或Regexp)是使用字符序列描述复杂搜索模式的一种方式. 然而,专门的Regex语法由于其复杂性使得有些

Pattern类(java JDK源码记录)

1 /* 2 * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. 3 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 *

正则表达式前瞻(?=)、后顾(?&lt;)、负前缀(?!)、负后顾(?&lt;!)

正则表达式前瞻(?=).后顾(?<).负前缀(?!).负后顾(?<!) 正则表达式前瞻.后顾这几个概念好像比较少会碰到,但是对于解决一些特定的匹配问题有非常重要的作用. 这几个概念的英文是 Lookahead and Lookbehind Zero-Length Assertions ,完整的中文名应该是前瞻后顾零宽断言.它匹配一些字符,但是并不包含匹配模式,只是确定是否匹配,也就是所谓的零宽. 前瞻 Lookahead 使用 ?= ,q(?=u) ,表示 u 前面是 q ,也就是 q 后面跟

Android字符串格式化开源库phrase介绍

在上一篇博客Android通过String.format格式化(动态改变)字符串资源的显示内容中介绍了通过String.format来格式化string.xml文件中的字符串,本文介绍一个可以实现同样功能的开源库phrase,相比于String.format,通过phrase格式化字符串代码更具可读性. 一.phrase项目介绍: 1.源码:phrase项目的源代码很简单,里面总共只有一个类:Phrase.java,代码如下: /* * Copyright (C) 2013 Square, In

jquery_ui

/*! jQuery UI - v1.10.4 - 2014-01-17 * http://jqueryui.com * Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js,