正则表达式详解

1、简介

正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式统称被用来检索、替换哪些符合某个模式(规则)的文本。

正则表达式是对字符串(包括普通字符(例如a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用实现定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文件模式(pattern),模式描述在搜索文本时要匹配一个或多个字符串。

2、目的

给定一个正则表达式和另一个字符串,开发人员可以达到如下的目的:

①给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

②可以通过正则表达式,从字符串中获取开发人员想要的特定部分。

 

3、特点

正则表达式的特点具体如下所示。

①灵活性、逻辑性和功能性非常强;

②可以迅速地用极简单的方式达到字符串的复杂控制。

③对于刚接触的人来说,比较晦涩难懂。

由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。

4、语法

4.1 普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

4.2 非打印字符

 

非打印字符也可以是正则表达式的组成部分,如表1列出了表示非打印字符的转义序列。

4.3 特殊字符

 

所谓特殊字符,就是一些有特殊含义的字符,比如runoo*b中的*,简单地说就是表示任何字符串的意思。如果要查找字符串中的*符号,则需要对*进行转义,即在其前面加一个\,如runo\*ob匹配runo*ob。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符“转义”,即,将反斜杠字符\放在它们前面。如表2列出了正则表达式中的特殊字符。

4.4 限定符

 

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。如表3列出了正则表达式中的限定符。

 

 

4.5 定位符

定位符使用户能够将正则表达式固定到首行或行尾。它们还使用户能够创建这样的正在表达式,这些正则表达式出现在一个单词内、在一个单词的开头或一个单词的结尾。

定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。如表4列出了正则表达式中的限定符。

注意:

①不能将限定符与定位符一起使用。由于在紧靠换行或字边界的前面或后面不能有一个以上位置,因此不允许诸如“^*”之类的表达式。

②若要匹配一行文本开始处的文本,请在正则表达式开始使用^字符。不要将^的这种用法与中括号表达式内的用法混淆。

③若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用$字符。

④\b字符的位置是非常重要的,如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项。

4.6 选择

 

用圆括号将所有选项括起来,相邻的选项之间用“|”分割。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项之前来消除这种副作用。

其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

4.7 反向引用

 

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式总从左到右的顺序存储。缓冲区编号从1开始,醉倒可存储99个捕获的子表达式。每个缓冲区都可以使用“\n”访问,其中n为一个标识特定缓冲区的一位或两位十进制数。

可以使用非捕获元字符“?:”、“?=”或“?!”来重写捕获,忽略对相关匹配的保存。

反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。

5 元字符

如表5列出包含元字符的完整列表以及它们在正则表达式上下文中的行为。

6 运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高到低。如表6所示,从最高到最低说明了各种正则表达式运算符的优先级顺序。

7匹配规则

7.1基本模式匹配

一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:

^once

这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。

7.2字符簇

在INTERNET的程序中,正则表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:

[AaEeIiOoUu]

这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:

[a-z]                                                                     //匹配所有的小写字母

[A-Z]                                                                     //匹配所有的大写字母

[a-zA-Z]                                                                //匹配所有的字母

[0-9]                                                                     //匹配所有的数字

[0-9\.\-]                                                                //匹配所有的数字,句号和减号

[ \f\r\t\n]                                                              //匹配所有的白字符

7.3确定重复出现

一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数,具体重复匹配示例如表7所示。

8 示例

8.1简单表达式

正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。例如,单字符模式,如 A,不论出现在搜索字符串中的何处,它总是匹配字母 A。下面是一些单字符正则表达式模式的示例:

/a/

/7/

/M/

可以将许多单字符组合起来以形成大的表达式。例如,以下正则表达式组合了单字符表达式:a、7和M。

/a7M/

请注意,没有串联运算符。只须在一个字符后面键入另一个字符。

8.2字符匹配

句点(.)匹配字符串中的各种打印或非打印字符,只有一个字符例外。这个例外就是换行符(\n)。下面的正则表达式匹配aac、abc、acc、adc等等,以及a1c、a2c、a-c和a#c:

/a.c/

若要匹配包含文件名的字符串,而句点 (.) 是输入字符串的组成部分,请在正则表达式中的句点前面加反斜杠 (\) 字符。举例来说明,下面的正则表达式匹配 filename.ext:

/filename\.ext/

这些表达式只让您匹配"任何"单个字符。可能需要匹配列表中的特定字符组。

8.3中括号表达式

若要创建匹配字符组的一个列表,请在方括号([和])内放置一个或更多单个字符。当字符括在中括号内时,该列表称为"中括号表达式"。与在任何别的位置一样,普通字符在中括号内表示其本身,即,它在输入文本中匹配一次其本身。大多数特殊字符在中括号表达式内出现时失去它们的意义。不过也有一些例外,如:

①如果]字符不是第一项,它结束一个列表。若要匹配列表中的]字符,请将它放在第一位,紧跟在开始[后面。

②\字符继续作为转义符。若要匹配\字符,请使用\\。

括在中括号表达式中的字符只匹配处于正则表达式中该位置的单个字符。以下正则表达式匹配Chapter1、Chapter2、Chapter3、Chapter4和Chapter5:

/Chapter [12345]/

请注意,单词 Chapter 和后面的空格的位置相对于中括号内的字符是固定的。中括号表达式指定的只是匹配紧跟在单词Chapter和空格后面的单个字符位置的字符集。

8.4替换和分组

替换使用|字符来允许在两个或多个替换选项之间进行选择。例如,可以扩展章节标题正则表达式,以返回比章标题范围更广的匹配项。但是,这并不替换匹配并不是那样简单。替换匹配|字符任一侧最大的表达式。

可能认为,下面的表达式匹配出现在行首和行尾、后面跟一个或两个数字的 Chapter 或 Section:

/^Chapter|Section [1-9][0-9]{0,1}$/

很遗憾,上面的正则表达式要么匹配行首的单词Chapter,要么匹配行尾的单词Section及跟在其后的任何数字。如果输入字符串是Chapter22,那么上面的表达式只匹配单词Chapter。如果输入字符串是Section22,那么该表达式匹配Section22。

若要使正则表达式更易于控制,可以使用括号来限制替换的范围,即,确保它只应用于两个单词Chapter和Section。但是,括号也用于创建子表达式,并可能捕获它们以供以后使用,这一点在有关反向引用的那一节讲述。通过在上面的正则表达式的适当位置添加括号,就可以使该正则表达式匹配Chapter1或Section3。

下面的正则表达式使用括号来组合Chapter和Section,以便表达式正确地起作用:

/^Chapter|Section [1-9][0-9]{0,1}$/

尽管这些表达式正常工作,但 Chapter|Section 周围的括号还将捕获两个匹配字中的任一个供以后使用。由于在上面的表达式中只有一组括号,因此,只有一个被捕获的"子匹配项"。

8.5其他示例

下面列出一些正则表达式示例,如表8所示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值