规则表达式(Regular Expression),又称做正则表达式,一般用于检索、替换符合指定规则的文本,正则表达式定义的规则,称做模式(Pattern),即正则表达式的做用是从文本中查找到符合模式的文本。正则表达式
正则表达式定义的模式,是由"\"+普通字符构成的,把“\”字符称做转义字符,是由于它把普通的字符转义为有特殊含义的元字符。注意,正则表达式是区分大小写的,能够经过表达式选择来忽略大小写限制。spa
1,经常使用元字符.net
用以匹配特定的字符(字母,数字,符号),注意字母是区分大小写的:htm
2,重复字符或分组blog
指定前面一个字符或分组重复的次数:教程
3,分组,转义,分支文档
这些字符有特定的含义和用途:字符串
匹配字符是指在元字符所在的位置处,匹配一个字符:get
注意:正则表达式是区分大小写的,元字符的大写和小写形式表示的含义是不一样的;文本字符的大小写也是不一样的。it
元字符其实是由字符“\”和普通字符构成的,“\”称做转义字符,也就是说,“\”的做用是把普通字符转换为特殊的字符。因为元字符也是文本中的普通字符,当须要匹配这些特殊字符时,例如,文本中包含"\","."等特殊字符时,必须使用转义字符,把特殊字符转义为普通字符。对于转义字符自己,\\表示一个“\”。
使用\s匹配全部空白字符,包括:空格符,制表符,换行符和回车符。
元字符中匹配位置的元字符主要是:
匹配位置的元字符不占用字符,只是匹配一个位置,例如,\b 表示匹配一个位置,并不占用任何字符,这个位置的一侧是单词字符,一侧为非单词字符。
字符组是若干字符的组合,表示只匹配其中一个字符:
1,字符组
若是要匹配字符grey和gray,可使用字符组: gr[ae]y,该正则表达式的意思是:先找到字符gr,而后跟着一个a或e,最后是一个字符y。
注意:在字符组之外,普通字符(如gr[ae]y中的g和r)都有接下来是(and then)的意思,这与字符组内部的状况是彻底相反的。字符组的内容是在同一个位置可以匹配的若干字符,因此他的意思是“或”。如“[0123456789]”就是匹配1到9之间的任意一个数字。若是“<H[1234]>”就是用来匹配<H1>,<H2>,<H3>,<H4>。
2,连字符
在字符组内部“-”(连字符)出如今两个字符中间,表示一个范围,例如:
注意:只有在字符组内部,连字符才是元字符,不然他就是只能匹配普通的连字符号。连字符还有一个例外,即便在字符组内部,若是连字符出如今字符组的开头(或排除型字符组的开头,下面会讲,如[^-]),那也不是元字符而只是一个普通字符。一样的道理,问号和点号(后面会讲到这两个元字符)一般被当作元字符处理,但在字符组里则不是如此。只有连字符和^(下面立刻讲到,是排除字符)才多是字符组里的元字符(可是转义符,字符组简记法仍然有效,即[\da-zA-Z]或[^\da-zA-Z]或[\\"]中的\仍然有转义的含义,\d仍然表明数字,\\"仍然表明字符串中的“\"”单独的\不会匹配任何字符,\\会匹配字符'\')。至关于字符组内部有一个本身独立的小世界,有本身的规则。
3,字符组内的排除字符
用“[^…]”取代“[…]”,这个字符组就会匹配任何未列出的字符。例如”[^1-8]”匹配除了1到8之外的任何字符。注意:这句话有两层含义,一个是排除1-8字符,另外一个是必定要匹配一个字符。
例子:匹配q后面不是u的字符,正则是”q[^u]”。那么qi会被匹配。那Qantas呢?Iraq呢?答案是这两个都不会被匹配,一个是由于Q是大写,一个是由于q在最后,后面没有除了u之外的任何字符。再次注意,排除型字符组也是要匹配一个字符的。
量词用于设置匹配前面一个字符的次数:
问号,加号和星号统称为量词,表示前面一个字符的重复次数。
1,可选字符 ?
这些元字符,只用于匹配相邻的前一个字符;若是要匹配多个字符,须要使用(),那么用于表示()内的字符重复,例如:
把()做为一个总体来看待,是一个元素,括号内的元素能够不少。
2,“+(加号)”和”*(星号)”
+和*的做用与?相似,元字符”+”表示“前面紧邻的元素出现一次或屡次”;而元字符”*”表示“前面紧邻的元素不出现或出现任意屡次”,换种说法就是”*”表示匹配尽量多的次数,但若是一次都不匹配也不要紧。”+”表示匹配尽量多的次数,但若是一次都不匹配就报告失败。
3,区间量词
区间量词“{min, max}” 表示重复次数的范围,其中min为下限,若是min为空,表示没有下限;max为上线,若是max为空,表示没有上限。例如,对于正则 ”a{3,12}”表示可以允许a出现3到12次,用区间量词来表示其余量词:问号对应“{0,1}”,加号对应”{1,}”, 星号对应”{0,}”
元字符“|”,表示“或(or)”关系,表示从多个候选的子表达式中,只须要匹配一个。子表达式的范围是由()来限制的,若是没有(),那么以元字符“|”,把表达式分割为两个子表达式,例如:
“gr[ea]y”与“gr(a|e)y”的例子可能会让人以为多选结构与字符组没太大的区别,可是不要混淆这两个概念。一个字符组只能匹配目标文本中的单个字符,而每一个多选结构自身多是完整的正则表达式,均可以匹配任意长度的文本。
比较”^From|Subject|Date:*”和”^(From|Subject|Date):*”会发现匹配结果大不相同,第一个表达式由3个多选分支构成,能匹配”^From”或”Subject”或”Date:*”,实用性不大。咱们但愿在每个多选分支前都有脱字符,以后都有”:*”,因此应该使用括号来限制这些多选分支: ”^(From|Subject|Date):*”,含义是匹配以“From:*”或“Subject:*”或“Date:*”开头的文本行。
()是分组元字符,最多见的用途是:
还有一个做用是环视,下文分享。
参考文档: