您好,欢迎访问三七文档
阳光服务关爱客户上海阳关网络信息技术有限公司正则表达式阳光服务关爱客户一、正则表达式的定义二、正则表达式的作用三、正则表达式的语法阳光服务关爱客户一、正则表达式的定义正则表达式是一个描述一组字符串的模板。是使用多种操作符来组合更小的表达式构建类似算术表达式。建立块的基本原则是正则表达式匹配一个单字符。多数字符,包括所有的字幕和数字,都是匹配它们自己的正则表达式。任何带有特殊含义的字符可以以反斜杠(/)开头来进行引用。阳光服务关爱客户一、正则表达式的定义二、正则表达式的作用三、正则表达式的语法阳光服务关爱客户二、正则表达式的作用1.测试字符串内的模式例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。2.替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。基于模式匹配从字符串中提取子字符串。3.可以查找文档内或输入域内特定的文本。例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些HTML格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该HTML格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。阳光服务关爱客户一、正则表达式的定义二、正则表达式的作用三、正则表达式的语法阳光服务关爱客户三、正则表达式的语法搭建测试环境正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难于读写,容易出错,所以很有必要创建一种工具来测试正则表达式。我使用的是Eclipse的插件“QuickREx”,下载后直接放在eclipse\plugins目录下,重启Eclipse。WindowShowViewotherQuickRexQuickRex,进入测试窗口,如图:输入正则表达式输入字符串阳光服务关爱客户三、正则表达式的语法入门假设你在一篇英文小说里查找hi,你可以使用正则表达式hi这是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。但是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。那么我们就引出来第一个正则表达式是特殊代码\b,它代表了单词的开头或结尾,也就是单词的分界处。我们叫这种特殊的代码为元字符。还有一个元字符和上面的容易混淆,那就是\d。它代表什么意思呢?让我们先看个例子:0\d\d-\d\d\d\d\d\d\d\d以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码),那么大家就很明显的知道了\d这个元字符就是匹配任何数字。当然也可以使用0\d{2}-\d{8}来实现上面的例子,{2}({8})的意思是前面\d必须连续重复匹配2次(8次)。阳光服务关爱客户三、正则表达式的语法元字符.匹配除换行符以外的任意字符\w匹配字母或数字或下划线\s匹配任意的空白符\d匹配数字\b匹配单词的开始和结束^匹配字符串的开始$匹配字符串的结束表1.常用的元字符阳光服务关爱客户三、正则表达式的语法元字符例子\b\w{6}\b匹配刚好6个字母/数字的单词^\d{5,12}$5位到12位数字{5,12}和上面提到的{2}不相同,{2}是指刚好2个字符,{5,12}是指5到12个字符。注意:如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。这时你就必须使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.例如:匹配,c:\\Windows匹配c:\Windows。阳光服务关爱客户三、正则表达式的语法重复*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次表2.常用的限定符阳光服务关爱客户三、正则表达式的语法重复例子Windows\d+匹配Windows后面跟1个或更多数字13\d{9}匹配13后面跟9个数字(中国的手机号)^\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)阳光服务关爱客户三、正则表达式的语法字符类要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办呢?很简单,你只需要在中括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)(英文语句通常只以这三个标点结束)。例子\(?0\d{2}[)-]?\d{8}匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678阳光服务关爱客户三、正则表达式的语法反义\W匹配任意不是字母,数字,下划线,汉字的字符\S匹配任意不是空白符的字符\D匹配任意非数字的字符\B匹配不是单词开头或结束的位置[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou这几个字母以外的任意字符表3.常用的反义代码阳光服务关爱客户三、正则表达式的语法反义例子\S+匹配不包含空白符的字符串。a[^]+匹配用尖括号括起来的以a开头的字符串阳光服务关爱客户三、正则表达式的语法替换正则表达式里的替换指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开例子\(0\d{2}\)[-]?\d{8}|0\d{2}[-]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用替换时,顺序是很重要的。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配替换时,将会从左到右地测试每个分枝条件,如果满足了某个分枝的话,就不会去管其它的替换条件了。阳光服务关爱客户三、正则表达式的语法分组我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。例子(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。但是上面的正则表达式也可以匹配256.300.888.999这种不可能存在的IP地址如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)大家应该可以分析出来吧?试试看!阳光服务关爱客户三、正则表达式的语法分组捕获(exp)匹配exp,并捕获文本到自动命名的组里(?nameexp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号零宽断言(?=exp)匹配exp前面的位置(?=exp)匹配exp后面的位置(?!exp)匹配后面跟的不是exp的位置(?!exp)匹配前面不是exp的位置注释(?#comment)这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读表4.常用的分组语法阳光服务关爱客户三、正则表达式的语法分组例子\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像gogo,kittykitty\1代表分组1匹配的文本。也可以用\b(?Word\w+)\b\s+\kWord\b和\b(?“Word”\w+)\b\s+\k“Word”\b来表示。(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I‘msingingwhileyou’redancing.时,它会匹配sing和danc。(?=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找readingabook时,它匹配ading。(?=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词阳光服务关爱客户三、正则表达式的语法分组例子(?![a-z])\d{7}匹配前面不是小写字母的七位数字(?=(\w+)).*(?=\/\1)匹配不包含属性的简单HTML标签内里的内容。(?(\w+))指定了这样的前缀:被尖括号括起来的单词(比如可能是b),然后是.*(任意的字符串),最后是一个后缀(?=\/\1)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是b的话,后缀就是/b了。整个表达式匹配的是b和/b之间的内容(再次提醒,不包括前缀和后缀本身)。上面的正则表达式也可以写成这样:(?=#断言要匹配的文本的前缀(\w+)#查找尖括号括起来的字母或数字(即HTML/XML标签))#前缀结束.*#匹配任意文本(?=#断言要匹配的文本的后缀\/\1#查找尖括号括起来的内容:前面是一个“/”,后面是先前捕获的标签)#后缀结束阳光服务关爱客户三、正则表达式的语法贪婪与懒惰*?重复任意次,但尽可能少重复+?重复1次或更多次,但尽可能少重复??重复0次或1次,但尽可能少重复{n,m}?重复n到m次,但尽可能少重复{n,}?重复n次以上,但尽可能少重复表5.懒惰限定符阳光服务关爱客户三、正则表达式的语法贪婪与懒惰例子a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aababa.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab阳光服务关爱客户三、正则表达式的语法处理选项名称说明IgnoreCase(忽略大小写)匹配时不区分大小写。Multiline(多行模式)更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)Singleline(单行模式)更改.的含义,使它与每一个字符匹配(包括换行符\n)。IgnorePatternWhitespace(忽略空白)忽略表达式中的非转义空白并启用由#标记的
本文标题:正则表达式的介绍
链接地址:https://www.777doc.com/doc-3383216 .html