正则表达式中的断言,作为高级应用出现,倒不是因为它有多难,而是概念比较抽象,不容易理解而已,今天就让小菜通俗的讲解一下。
如果不用断言,以往用过的那些表达式,仅仅能获取到有规律的字符串,而不能获取无规律的字符串。
举个例子,比如html源码中有<title>xxx</title>标签,用以前的知识,我们只能确定源码中的<title>和</title>是固定不变的。因此,如果想获取页面标题(xxx),充其量只能写一个类似于这样的表达式:<title>.*</title>,而这样写匹配出来的是完整的<title>xxx</title>标签,并不是单纯的页面标题xxx。
想解决以上问题,就要用到断言知识。
在讲断言之前,读者应该先了解分组,这有助于理解断言。
分组在正则中用()表示,根据小菜理解,分组的作用有两个:
n 将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果。
n 分组之后,可以通过后向引用简化表达式。
先来看第一个作用,对于IP地址的匹配,简单的可以写为如下形式:
\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
但仔细观察,我们可以发现一定的规律,可以把.\d{1,3}看成一个整体,也就是把他们看成一组,再把这个组重复3次即可。表达式如下:
\d{1,3}(.\d{1,3}){3}
这样一看,就比较简洁了。
再来看第二个作用,就拿匹配<title>xxx</title>标签来说,简单的正则可以这样写:
<title>.*</title>
可以看出,上边表达式中有两个title,完全一样,其实可以通过分组简写。表达式如下:
<(title)>.*</\1>
这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是<(title)>.*</\1>,然后从左到右,依次为分组编号,因此,(title)是第1组。
用\1这种语法,可以引用某组的文本内容,\1当然就是引用第1组的文本内容了,这样一来,就可以简化正则表达式,只写一次title,把它放在组里,然后在后边引用即可。
以此为启发,我们可不可以简化刚刚的IP地址正则表达式呢?原来的表达式为\d{1,3}(.\d{1,3}){3},里边的\d{1,3}重复了两次,如果利用后向引用简化,表达式如下:
(\d{1,3})(.\1){3}
简单的解释下,把\d{1,3}放在一组里,表示为(\d{1,3}),它是第1组,(.\1)是第2组,在第2组里通过\1语法,后向引用了第1组的文本内容。
经过实际测试,会发现这样写是错误的,为什么呢?
小菜一直在强调,后向引用,引用的仅仅是文本内容,而不是正则表达式!
也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。
因此,(\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。
至此,读者已经掌握了传说中的后向引用,就这么简单。
接下来说说什么是断言。
所谓断言,就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串。
就拿文章开篇的例子来说,我们想要的是xxx,它没有规律,但是它前边肯定会有<title>,后边肯定会有</title>,这就足够了。
想指定xxx前肯定会出现<title>,就用正后发断言,表达式:(?<=<title>).*
向指定xxx后边肯定会出现</title>,就用正先行断言,表达式:.*(?=</title>)
两个加在一起,就是(?<=<title>).*(?=</title>)
这样就能匹配到xxx。
相信读者看到这,已经蒙了,不用急,待小菜慢慢讲来。
其实掌握了规律,就很简单了,无论是先行还是后发,都是相对于xxx而言的,也就是相对于目标字符串而言。
假如目标字符串后边有条件,可以理解为目标字符串在前,就用先行断言,放在目标字符串之后。
假如目标字符串前边有条件,可以理解为目标字符串在后,就用后发断言,放在目标字符串之前。
假如指定满足某个条件,就是正。
假如指定不满足某个条件,就是负。
断言只是条件,帮你找到真正需要的字符串,本身并不会匹配!
(?=X ) |
零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 |
(?!X) |
零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。 |
(?<=X) |
零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 |
(?<!X) |
零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 |
从断言的表达形式可以看出,它用的就是分组符号,只不过开头都加了一个问号,这个问号就是在说这是一个非捕获组,这个组没有编号,不能用来后向引用,只能当做断言。
摘自http://www.cnblogs.com/iyangyuan/archive/2013/05/30/3107390.html
相关推荐
### 正则表达式详解 #### 一、正则表达式概述 正则表达式是一种强大的文本模式匹配工具,广泛应用于编程语言如Java中,用于处理字符串数据,实现字符串的搜索、替换、提取等操作。它能够精确描述复杂的文本规则,...
### 正则表达式详解 #### 一、正则表达式的定义与背景 正则表达式(Regular Expression),简称regex或regexp,是一种用于描述文本模式的强大工具。它可以帮助我们在文本中进行精确匹配、查找以及替换操作。正则...
除了零宽断言和替换,还有许多高级正则表达式技巧,如分组、重复、字符集等。 #### 例4:匹配连续的三个相同字符 ``` (\w)\1\1 ``` 这会找到像“aaa”、“bbb”这样的模式。 #### 例5:匹配邮箱地址 ``` \w+([-+.]...
JavaScript 正则表达式详解 JavaScript 中的正则表达式是指使用特殊字符来描述字符串模式的表达式。正则表达式可以用来匹配、检索和操作字符串。 RegExp 对象 在 JavaScript 中,正则表达式可以被定义为一个 ...
在实际应用中,正则表达式的分组、引用、断言等功能都是实现复杂文本解析和数据提取不可或缺的工具。掌握这些知识点,能够帮助开发者在处理文本数据时更加得心应手。总之,Python正则表达式的分组概念及其用法是提高...
1. **基本原理和技巧**:本书首先通过一个精炼的教程帮助读者掌握正则表达式的基础知识,如元字符、量词、分组、断言等,使读者能够迅速上手并熟练运用这些技巧。 2. **多语言支持**:书中详细阐述了如何在不同的...
### 正则表达式断言 断言用于指定一个位置,使得正则表达式引擎在该位置进行匹配时,仅验证该位置的条件是否满足,但并不消耗任何字符。断言分为四种类型: - **正向先行断言** (`(?=...)`): 指明某个位置后面必须...
5. 正则表达式的高级特性:包括正则表达式的分组,使用括号`()`可以创建一个分组,分组可以用于捕获和替换操作。还有前瞻断言(look ahead assertions),比如`(?=...)`表示匹配字符串后面的位置。 6. 多行模式:...
通过这份"java正则表达式详解(PDF)"文档,读者将能深入了解Java正则表达式的各个方面,掌握如何在实际项目中有效地运用正则表达式进行字符串处理。无论你是Java初学者还是经验丰富的开发者,这份资料都将是一份...
### 正则表达式使用详解 正则表达式是一种强大的文本匹配工具,广泛应用于各种编程语言和工具中,用于字符串的查找、替换等操作。本文将深入解析正则表达式的各个组成部分及其用法。 #### 一、基本概念 在正则...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,...通过阅读《Java 正则表达式的总结和一些小例子.pdf》和《Java正则表达式详解.pdf》,你将能够深入学习和实践更多正则表达式的用法,进一步提升编程技能。
**mtracer2.0正则表达式验证工具详解** 在信息技术领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于搜索、替换、提取或验证字符串模式。正则表达式广泛应用于数据验证、文本分析...
### Java正则表达式知识点详解 #### 一、正则表达式基础概念 正则表达式(Regular Expression)是一种在字符串操作中具有强大功能的工具,它可以用来进行字符串的匹配、搜索、替换等操作。Java提供了`java.util....
在“正则表达式工具和常用表达式详解.zip”压缩包中,你将找到关于正则表达式的全面指南,无论你是初学者还是有经验的开发者,都能从中受益。这个资料可能包括了以下内容: 1. **正则表达式基础**:介绍正则表达式...
### Shell正则表达式详解 #### 什么是正则表达式? 正则表达式(Regular Expression),简称regex或regexp,是一种用于匹配字符串中字符组合的工具。它在多种编程语言和环境中都有应用,如Shell脚本、Perl、Python...
### 正则表达式30分钟入门教程知识点详解 #### 一、正则表达式的定义与用途 **正则表达式**是一种强大的文本处理工具,主要用于描述文本模式的规则,以便进行模式匹配、查找和替换等操作。在编程中,正则表达式...
精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...
### 正则表达式基础知识详解 #### 一、正则表达式概述 正则表达式是一种强大的文本处理工具,主要用于模式匹配、查找以及替换等操作。通过正则表达式,开发者能够灵活地处理各种字符串数据,实现高效的数据提取与...
### 正则表达式入门知识点详解 #### 一、本文目标 本文旨在为初学者提供一个全面而深入的正则表达式入门指南。通过本文的学习,读者将能够掌握正则表达式的基本概念、常用语法以及高级特性,并能够在实际工作中灵活...