正则表达式--教程三(匹配规则及示例)

正则表达式--教程一 简介(共三篇):https://blog.csdn.net/alzzw/article/details/99463959

正则表达式--教程二(语法):https://blog.csdn.net/alzzw/article/details/99470144

正则表达式--元字符:https://blog.csdn.net/alzzw/article/details/99474676

 

正则表达式--匹配规则:

基本模式匹配:

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

^once

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

bucket$

这个模式与" Who kept all of this cash in a bucket"匹配,与" buckets"不匹配。字符^和$同时使用时表示精确匹配(字符串与模式一样):

^bucket$

只匹配字符串" bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式

once

与字符串

There once was a man from NewYork

Who kept all of his cash in a bucket

是最匹配的

在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠0打头。制表符的转义序列是:t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式;

^t

类似的,用n表示"新行",r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用表示,句号用表示,以此类推.

字符簇:

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

[AaEeIiOoUu]

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

【a-z】//匹配所有的小写字母
【A-2】//匹配所有的大写字母
【a-zA-z】//匹配所有的字母
【8-9】//匹配所有的数字
【8-9,-】//匹配所有的数字,句号和减号frtn】//匹配所有的白字符

同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3"或"b52"的话,用这个模式

^[a-z][0-9]$

尽管【a-2】代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示非或排除"的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:

^[^0-9][0-9]$

这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:

【^a-z】//除了小写字母以外的所有字符
【^/^】//除了()(/)(^)之外的所有字符
【^" '】//除了双引号(")和单引号(')之外的所有字符

特殊字符"."(点,句号)在正则表达式中用来表示除了"新行"之外的所有字符。所以模式"^.5$与任何两个字符的、以数字5结尾和以其他非"新行字符开头的字符串匹配。模式∵"可以匹配任何字符串,除了空串和只包括一个新行"的字符串。
PHP的正则表达式有一些内置的通用字符簇,列表如下:

正则表达式--教程三(匹配规则及示例)

确认重复出现:

到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号()用来确定前面的内容的重复出现的次数:

正则表达式--教程三(匹配规则及示例)

这些例子描述了花括号的三种不同的用法。一个数字{x}的意思是前面的字符或字符簇只出现x次个数字加逗号{x,}的意思是前面的内容出现x或更多的次数;两个数字用逗号分隔的数字{x,y}
表示前面的内容至少出现x次,但不超过y次。我们可以把模式扩展到更多的单词或数字:

^【a-zA-z0-9_】{1,}$         //所有包含一个以上的字母、数字或下划线的字符串
^【1-9】【0-91{0,}$           //所有的正整数
^-{0,1}【0-9】{1,}$                //所有的整数
^【-1?【0-9】+,?【0-9】+$        //所有的浮点数

最后一个例子不太好理解,是吗?这么看吧:以一个可选的负号(【-】?)开头(^)、跟着1个或更多的数字(【0-9】+)、和一个小数点(,)再跟上1个或多个数字(【0-9】+),并且后面没有其他任何东西($)。下面你将知道能够使用的更为简单的方法特殊字符?与{0,1}是相等的,它们都代表着:0个或1个前面的内容或前面的内容是可选的。所以刚才的例子可以简化为:

^-?[0-9]{1,}.?[0-9]{1,}$

特殊字符*与{0,}是相等的,它们都代表着0个或多个前面的内容。最后,字符+与{1,}是相等的,表示1个或多个前面的内容,所以上面的4个例子可以写成:

^【a-zA-Z0-9】+$                       //所有包含一个以上的字母、数字或下划线的字符串
^【1-9】【0-9】*$                   //所有的正整数
^-?【0-9】+$                             //所有的整数
^【-】?【0-9】+(.【0-9】+)?$              //所有的浮点数

当然这并不能从技术上降低正则表达式的复杂性,但可以使它们更容易阅读。


示例:

简单表达式:

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

/a/

/7/

/M/

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

/a7M/

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

字符匹配:

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

/a.c/

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

/filename.ext/

这些表达式只让您匹配"任何"单个字符。可能需要匹配列表中的特定字符组。例如,可能需要查找用数字表示的章节标题( Chapter1、 Chapter2等等).

中括号表达式:

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

如果]字符不是第一项,它结束一个列表。若要匹配列表中的]字符,请将它放在第一位,紧跟在开始[后面字符继续作为转义符。若要匹配字符,请使用.

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

/Chapter [12345]/

请注意,单词 Chapter和后面的空格的位置相对于中括号内的字符是固定的。中括号表达式指定的只是匹配紧跟在单词 Chapter和空格后面的单个字符位置的字符集。这是第九个字符位置若要使用范围代替字符本身来表示匹配字符组,请使用连字符(-)将范围中的开始字符和结束字符分开单个字符的字符值确定范围內的相对顺序。下面的正则表达式包含范围表达式,该范围表达式等效于上面显示的中括号中的列表。

/Chapter [1-5]/

当以这种方式指定范围时,开始值和结束值两者都包括在范围内。注意,还有一点很重要,按 Unicode排序顺序,开始值必须在结束值的前面。
若要在中括号表达式中包括连字符,请采用下列方法之一:

        用反斜杠将它转义:

【-】

      将连字符放在中括号列表的开始或结尾。下面的表达式匹配所有小写字母和连字符:

[-a-z]

[a-z-]

创建一个范围,在该范围中,开始字符值小于连字符,而结束字符值等于或大于连字符。下面的两个正则表达式都满足这一要求:

[!--]

[!-~]

若要查找不在列表或范围内的所有字符,请将插入符号(^)放在列表的开头。如果插入字符出现在列表中的其他任何位置,则它匹配其本身。下面的正则表达式匹配1、2、3、4或5之外的任何数字和字符:

/Chapter [^12345]/

在上面的示例中,表达式在第九个位置匹配1、2、3、4或5之外的任何数字和字符。这样,例如,Ch apter7就是一个匹配项, Chapter9也是一个匹配项。
上面的表达式可以使用连字符(-)来表示:

/Chapter [^1-5]/

中括号表达式的典型用途是指定任何大写或小写字母或任何数字的匹配。下面的表达式指定这样的匹配:

/[A-Za-z0-9]/

替换和分组:

替換使用字符来允许在两个或多个替换选项之间进行选择。例如,可以扩展章节标题正则表达式,以返回比章标题范围更广的匹配项。但是,这并不象您可能认为的那样简单。替换匹配|字符任一侧最大的表达式。
您可能认为,下面的表达式匹配出现在行首和行尾、后面跟一个或两个数字的 Chapter或 Section:

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

很遗憾,上面的正则表达式要么匹配行首的单词 Chapter,要么匹配行尾的单词 Section及跟在其后的任何数字。如果输入字符串是 Chapter22,那么上面的表达式只匹配单词 Chapter。如果输入字符串是Section22,那么该表达式匹配 Section22。
若要使正则表达式更易于控制,可以使用括号来限制替换的范围,即,确保它只应用于两个单词 Chapt er和 Section。但是,括号也用于创建子表达式,并可能捕获它们以供以后使用,这一点在有关反向引用的那一节讲述。通过在上面的正则表达式的适当位置添加括号,就可以使该正则表达式匹配 Chapter1或Section3.

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

/^(Chapter|Secyion) [1-9] [0-9] {0,1}$/

尽管这些表达式正常工作,但 Chapter/Section周围的括号还将捕获两个匹配字中的任一个供以后使用由于在上面的表达式中只有一组括号,因此,只有一个被捕获的"子匹配项"。
在上面的示例中,您只需要使用括号来组合单词 Chapter和 Section之间的选择。若要防止匹配被保存以备将来使用,请在括号內正则表达式模式之前放置?:。下面的修改提供相同的能力而不保存子匹配项:

/^(?:Chapter|Secyion) [1-9] [0-9] {0,1}$/

除?:元字符外,两个其他非捕获元字符创建被称为"预测先行"匹配的某些內容。正向预测先行使用?=指定,它匹配处于括号中匹配正则表达式模式的起始点的搜索字符串。反向预测先行使用?!指定,它匹配处于与正则表达式模式不匹配的字符串的起始点的搜索字符串。


例如,假设您有一个文档,该文档包含指向 Windows3.1、 Windows95、 Windows98和 Windows nt的引用。再进一步假设,您需要更新该文档,将指向 Windows95、 Windows98和 Windows nt的所有引用更改为 Windows2000.下面的正则表达式(这是一个正向预测先行的示例)匹配 Windows95 ,Windows 98和Windows NT:

/Windows(?=95 | 98 、NT)/

找到一处匹配后,紧接着就在匹配的文本(不包括预测先行中的字符)之后搜索下一处匹配。例如,如果上面的表达式匹配 Windows98,将在 Windows之后而不是在98之后继续搜索。

其他示例:

下面列出一些正则表达式示例:

正则表达式--教程三(匹配规则及示例)

 

上一篇:Chapter 5. Data(第五章 数据)


下一篇:使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#