2.9 零宽度断言-2.6 替换 -正则表达式学习笔记 -grule
2.9 零宽度断言 http://blog.csdn.net/wlzhengzebiaodashi/archive/2008/03/24/2213191.aspx
在2.1.1小节中,元字符\b、^、$都匹配一个位置,且这个位置满足一定的条件。在此,把满足这一个条件称为断言或零宽度断言。正则表达式中的常用零宽度断言明如表2-10所示。
表2-10零宽度断言
字符(断言)
|
说明
|
^
|
匹配行的开始位置。
|
$
|
匹配行的结束位置。
|
\A
|
匹配必须出现在字符串的开头。
|
\Z
|
匹配必须出现在字符串的结尾或字符串结尾处的\换行符号n之前。
|
\z
|
匹配必须出现在字符串的结尾。
|
\G
|
匹配必须出现在上一个匹配结束的地方。
|
\b
|
匹配字符的开始或结束位置。
|
\B
|
匹配不是在字符的开始或结束位置。
|
在表2-8中,表达式(?=experssion)、(?!experssion)、(?<=experssion)和(?<!experssion)都是匹配一个位置。下面将详细介绍表达式(?=experssion)和(?<=experssion)。
(?=experssion)又称为零宽度正预测先行断言,它断言自身位置的后面能够匹配表达式experssion。以下正则表达式匹配以字符串“ed”结尾的单词的前面部分,即匹配单词的除字符串“ed”之外的部分。
\b\w+(?=ed\b) (73)
(?<=experssion)又称为零宽度正回顾后发断言,它断言自身位置的前面能够匹配表达式experssion。以下正则表达式匹配以字符串“an”开头的单词的后面部分,即匹配单词的除字符串“an”之外的部分。
(?<=\ban)\w+\b (74)
使用工具Regex Tester分别测试正则表达式(73)和(74),结果分别如图和所示。
2.8 后向引用
当一个正则表达式被分组之后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右、以分组的左括号“(”为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。
反向引用提供查找重复字符组的方便的方法。它们可被认为是再次匹配同一个字符串的快捷指令。后向引用可以使用数字命名(即默认名称)的组号,也可以使用指定命名的组号。它们的具体说明如表2-8所示。
表2-8后向引用
表达式
|
说明
|
\数字
|
使用数字命名的后向引用。
|
\k<name>
|
使用指定命名的后向引用。
|
注意:在表2-8中,表达式\k<name>为.NET Framework所支持。
以下正则表达式匹配具有两个重复字符的单词。
\b(\w)\1\b (65)
注意:正则表达式\b(\w)\1\b和\b(\w)\w\b并不等效,第一个表达式只匹配两个相同字符的单词,而第二个表达式匹配具有两个字符(可以相同,也可以不相同)的单词。
以下正则表达式首先匹配单词的开头处,然后匹配一个字符和数字,再重复该字符和数字,最后是单词的结尾处。
\b(\w)(\d)\1\2\b (66)
使用工具Regex Tester分别测试了正则表达式(65)和\b(\w)\w\b,结果如图所示。在测试结果中,正则表达式\b(\w)\1\b只匹配了单词“aa”,而正则表达式\b(\w)\w\b可以匹配单词“aa”和“ab”。
以下正则表达式匹配以两个重复字符结尾的单词。
\b\w*(\w+)\1\b (67)
以下正则表达式匹配重复出现的单词。
\b(\w+)\b\s+\1\b (68)
上述正则表达式\b(\w+)\b\s+\1\b匹配的具体过程如下:
(1)表达式\b(\w+)\b匹配一个单词,且单词的长度至少为1;
(2)表达式\s+匹配一个或多个空白字符;
(3)表达式\1将重复子表达(\w+)匹配的内容,即重复匹配的单词;
(4)匹配单词的结束位置。
分组不但可以使用数字作为组号,而且还可以使用自定义名称作为组号。以下两个正则表达式都是将分组后的子表达式\w+命名为“word”。
(?<word>\w+) (69)
(?'word'\w+) (70)
因此,正则表达式\b(\w+)\b\s+\1\b和以下正则表达式等价,它们都匹配重复出现的单词。
\b(?<word>\w+)\b\s+\k<word>\b (71)
以下正则表达式和正则表达式\b\w*(\w+)\1\b等价,它也是匹配以两个重复字符结尾的单词。
\b\w*(?<char>\w+)\k<char>\b (72)
分组子表达式(?<name>)将元字符括在其中,并强制正则表达式引擎记住该子表达式匹配,同时使用“name”将该匹配进行命名。反向引用\k<name>使引擎对当前字符和以名称“name”存储的先前匹配字符进行比较,从而匹配具有重复字符的字符串。正则表达式中的常用分组说明如表2-9所示。
表2-9常用分组说明
字符
|
说明
|
(experssion)
|
匹配字符串experssion,并将匹配的文本保存到自动命名的组里。
|
(?<name>experssion)
|
匹配字符串experssion,并将匹配的文本以name进行命名。该名称不能包含标点符号,不能以数字开头。
|
(?:experssion)
|
匹配字符串experssion,不保存匹配的文本,也不给此组分配组号。
|
(?=experssion)
|
匹配字符串experssion前面的位置。
|
(?!experssion)
|
匹配后面不是字符串experssion的位置。
|
(?<=experssion)
|
匹配字符串experssion后面的位置。
|
(?<!experssion)
|
匹配前面不是字符串experssion的位置。
|
(?>experssion)
|
只匹配字符串experssion一次。
|
2.7 分组
分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用的字符为“(”和“)”,即左圆括号和右圆括号。分组之后,可以将字符为“(”和“)”之中的表达式看成一个整体来处理。以下正则表达式可以匹配重复出现字符串“abc”一次或两次的字符串。此时,表达式将“abc”看成一个整体来进行重复匹配。
(abc){1,2} (63)
以下正则表达式可以匹配简单的IP地址。
(\d{1,3}\.){3}\d{1,3} (64)
正则表达式式(64)解释:
\d{1,3}\.先匹配1~3位的整数然后匹配一个字符“.”(点号),如“1.”、“12.”、“123.”、“888.”等。
(\d{1,3}\.){3}将子表达式\d{1,3}\.匹配的字符串重复3次,如“1.2.3.”、“12.34.56.”、“123.456.789.”、“888.899.569.”等。
\d{1,3}将匹配1~3位的整数。
综合以上分析,正则表达式(\d{1,3}\.){3}\d{1,3}能够匹配简单的IP地址,如“10.0.0.1”、“123.123.235.235”等。使用工具Regex Tester测试正则表达式(64),结果如图2.25所示。
2.6 替换 (2)
正则表达式[Jj]ack可以匹配字符串“Jack”或者“jack”。该正则表达式还可以使用替换来实现同样的匹配效果。如下正则表达式等效于正则表达式[Jj]ack。
Jack|jack (59)
如下正则表达式等效于正则表达式Jack|jack。因此,正则表达式[Jj]ack、Jack|jack和Jack|jack能够匹配的所有字符串是相同。
(J|j)ack (60)
使用工具Regex Tester分别测试正则表达式[Jj]ack和(60),结果分别如图2.21和2.22所示。从图中可以看到,两个正则表达式匹配的结果是相同的。
正则表达式的常用替换说明如表2-7所示。
表2-7常用替换
字符或表达式
|
说明
|
|
|
匹配|(竖线)字符的左侧或右侧。
|
(?(表达式)yes|no)
|
表达式要么可以匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。
|
(?(name)yes|no)
|
以name命名的字符串要么匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。
|
注意:字符|在匹配表达式时,它首先匹配|字符的左侧部分。当左侧部分不匹配时,它才尝试匹配|字符的右侧部分。
给定以下两个正则表达式
\d{5}-\d{3}|\d{5} (61)
\d{5}|\d{5}-\d{3} (62)
根据字符|的匹配原则(优先匹配左侧表达式),正则表达式\d{5}|\d{5}-\d{3}只会匹配5位的数字字符串,而不会匹配用连接符合连接的8位数字字符串。然而,正则表达式\d{5}-\d{3}|\d{5}能够匹配用连接符合连接的8位数字字符串或者5位的数字字符串。因为,该表达式首先尝试匹配用连接符合连接的8位数字字符串,只有当未匹配时,才匹配5位的数字字符串。
使用工具Regex Tester分别测试了正则表达式(61)和(62),测试结果分别如图2.23和2.24所示。正则表达式\d{5}|\d{5}-\d{3}只匹配了字符串“12345”。而正则表达式\d{5}-\d{3}|\d{5}可以匹配字符串“12345-678”和字符串“12345”。
2.6 替换 (1)
正则表达式0\d{2}-\d{8}和0\d{3}-\d{7}分别匹配区号为3位和4位的固定电话号码,如果需要同时匹配区号为3位和4位的固定电话号码时,使用替换可以满足这一个需求。最简单的替换使用字符“|”表示,它表示如果某一个字符串匹配了正则表达式中的字符“|”的左边或者右边的规则,那么该字符串也匹配了该正则表达式。
以下正则表达式匹配了当前国内部分地区的两种固定电话号码:一种是号码的前4位为区号,后7位为本地号码;另一种是号码的前3位为区号,后8位为本地号码。其中,区号和本地号码都使用连接符号“-”进行连接。
0\d{2}-\d{8}|0\d{3}-\d{7} (56)
以下正则表达式匹配了当前国内部分地区的3种固定电话号码:一种是号码的前4位为区号,后7位为本地号码;另一种是号码的前3位为区号,后8位为本地号码;最后一种是号码的前4位为区号,后8位为本地号码。其中,区号和本地号码都使用连接符号“-”进行连接。
0\d{2}-\d{8}|0\d{3}-\d{7}|0\d{3}-\d{8} (57)
以下正则表达式匹配当前国内部分地区的区号为4位的固定电话号码。其中,区号和本地号码可以使用连接符号“-”进行连接,也可以不使用连接“-”符号。
0\d{3}-\d{7}|0\d{3}[-]?\d{7} (58)
使用工具Regex Tester测试正则表达式(58),测试结果如图所示。其中,电话号码0731-1234567和07311234567都均被匹配。
相关推荐
本文将深入探讨正则表达式的高级应用,特别是零宽断言和正则替换的150种表达方式。 ### 一、零宽断言 零宽断言(Zero-width Assertions)在正则表达式中用于标记位置,但不会消耗任何字符。有两种主要类型:正向零...
### 正则表达式知识点详解 #### 一、正则表达式基础介绍 正则表达式(Regular Expression),简称regex或regexp,是一种用于处理字符串的强大工具。它通过一系列的符号和字符来描述文本模式,从而实现对文本进行...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种简洁而强大的语法来定义一系列字符或字符组合,帮助程序员快速准确地定位和...
以上给出的正则表达式仅覆盖了一些基础用例,实际的正则表达式可以变得极其复杂,涉及更多的元字符和修饰符,如贪婪与非贪婪匹配、分组、零宽断言等。正则表达式的学习和掌握需要时间和实践,但一旦熟悉,它们将成为...
在编程领域,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换、分割等操作。在本教程中,我们将深入探讨如何使用正则表达式来拆分字符串,这对于数据处理和文本分析尤其有用。下面...
### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强有力的模式匹配工具,广泛应用于各种编程语言中,用于文本处理。正则表达式允许用户定义复杂的查找模式,这对于数据验证、搜索和替换操作特别...
`LLRegex`还支持其他高级特性,如命名捕获组、预查、后顾反向断言等,这些都是正则表达式中的强大工具。通过`LLRegex`,开发者可以在Swift项目中更加便捷地运用这些特性。 在`LLRegex-master`这个压缩包中,通常会...
本文档是小小明个人笔记,涵盖了正则表达式的各个方面,包括各种模式、分组、断言、匹配、查找、替换和切割等。文档中提供了详细的正则匹配规则表,涵盖了基本字符规则、预定义字符集、常用字符集、数量词、边界匹配...
### 正则表达式学习手册知识点总结 #### 1. 引言 正则表达式是一种强大的文本处理工具,能够帮助用户实现字符串的查找、替换等功能。正则表达式的应用场景非常广泛,尤其在编程领域中不可或缺。对于初学者来说,...
### 正则表达式在数据库查询中的应用 #### 引言 在数据库管理与应用程序开发中,查询数据是一项常见的任务。传统的SQL查询虽然强大,但在处理复杂查询时可能存在一定的局限性,尤其是涉及到文本数据的模式匹配时。...
在这个“正则表达式”学习笔记中,我们将深入探讨这一强大的工具。 1. **基础概念** - **字符集**:包括普通字符(如 `a`、`b`)和特殊字符(如 `.`、`\d`),它们组合起来形成匹配模式。 - **量词**:如 `*` ...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种特殊的语法来描述一个字符串集合,能够高效地进行模式查找和替换,是程序员...
正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换操作。C#作为.NET框架的一部分,提供了全面支持正则表达式的类库,使得开发人员能够方便地利用正则表达式进行复杂的文本处理任务。在这个...
正则表达式(Regular Expression,简称regex)是一种用于匹配字符串的强大工具,广泛应用于文本处理、数据验证、搜索和替换等场景。在这个“正则表达式学习资料整理”中,我们主要探讨的是如何理解和运用正则表达式...
本资源“源码(精通正则表达式&实战正则表达式)”专注于JavaScript环境下的正则表达式学习,通过一系列视频教程和配套源码,帮助开发者提升对正则表达式的理解和应用能力。 首先,"精通正则表达式五部视频"可能涵盖...
001_正则表达式初体验.wmv ...020_正则表达式非捕获分组之零宽断言.wmv 021_正则表达式非捕获分组之零宽断言2.wmv 022_正则表达式非捕获分组之负向零宽断言.wmv 023_正则表达式之贪婪与懒惰.wmv 024_正则表达式实例应用
正则表达式是编程语言中用于模式匹配的强大工具,尤其在数据处理和文本搜索替换时极为有用。Python作为一门广泛使用的编程语言,内置了强大的正则表达式支持。本教程旨在帮助初学者在30分钟内对Python中的正则表达式...
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串。它通过一套特定的规则(模式)来定义字符串的匹配模式,广泛应用于编程语言、文本编辑器、Web 开发等领域。本教程旨在帮助初学者在30分钟内...
正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助我们实现字符串的搜索、替换等操作。它在多种编程语言中都有应用,尤其是在JavaScript中,正则表达式被广泛用于数据验证、文本提取等方面。 ##...