K:正则表达式之基础简介

来源:互联网 发布:php 类调用静态方法 编辑:程序博客网 时间:2024/05/22 03:27

正则表达式(regular expression 简称regex)是一种工具,和其它工具一样是为了解决某一类问题而发明的。正则表达式是一些用来匹配和处理文本的字符串。平时主要用于查找和替换符合相应模式的文本,而该模式,就是由正则表达式所定义。需要注意的是,使用正则表达式对字符串进行匹配,正则表达式的编写方案并不是唯一的,同一个问题,往往会有多种方案。同时,需要注意的是正则表达式的语法是区分大小写的即\d\D表示的是不同的意思。

正则表达式的特殊字符及其含义如下:

. 用来匹配任意单个字符,当字符本身为“.”时,需要使用\来对其进行转义即(\.用于表示.这个字符本身,而不是任意单个字符。在绝大多数的正则表达式的实现里,.只能用于匹配除了换行符以外的任何单个字符)

[]用来定义一个字符集合。其表示在[]中所包含的字符的其中一个类似与sql语句中的in的作用。在[]中,可以使用“-”来表示一个集合的范围,例如[1-9][0123456789]是等价的,当然,其不仅限于数字,以下的也是合法的字符区间:

A-Z:匹配从AZ的所有大写字母

a-z:匹配从az的所有小写字母

A-F:匹配从AF的所有大写字母

A-z:匹配从ASCII字符AASCII字符z的所有字母,该模式不常用,因为其还包含着[^等在ASCII字符表里排列在Za之间的字符。可以在一个字符集合中给出多个字符区间,例如[A-Za-z0-9]表示所有的数字和大小写字母

同时,可以使用[^]用于表示需要匹配的字符不在该定义的集合区间中。当要匹配“[]”本身的时候,需要使用\来对其进行转义,即\[\]的形式表示[]本身。

ps:对于转义字符\,若要表示该字符本身,需要使用\\来表示

 

以下的均为空白符(即原始文本的中的非打印字符)

\f用来匹配一个换页符

\n用来匹配一个换行符

\r用来匹配一个回车符

\t用来匹配一个制表符

\v用来匹配一个垂直制表符

 

ps:需要注意的是,\r\nwindows所使用的文本行结束标签,UnixLinux系统只使用一个换行符来结束一个文本行;换句话说,在Unix/Linux系统上匹配空白行只用\n即可,不需要加上\r。还有一点是,fnrtv等字符本身是普通的字符,当用其来匹配空白符的时候,需要对其进行转义。

 

\d用于匹配任意一个数字,其等价于[0-9]

\D用于匹配任意一个非数字字符,其等价于[^0-9]

\w用于匹配任意一个字母字符(包括大小写)和数字字符或下划线字符,等价于[0-9A-Za-z_]

\W用于匹配任意一个非字母(包括大小写)数字或下划线字符,等价于[^0-9A-Za-z_]

\s用于匹配任意一个空白字符,等价于[\f\n\r\t\v]

\S用于匹配任意一个非空白字符,等价于[^\f\n\r\t\v]

\x用于匹配某个特定字符的十六进制,例如\x0A对应于ASCII码字符10,其效果等价于\n

\0用于匹配某个特定字符的八进制,例如\011对应于ASCII码中的字符9,其等价于\t

 

POSIX字符类:

[:alnum:]用于匹配任意一个字母或数字(等价于[a-zA-Z0-9])

[:alpha:]用于匹配任意一个字母(等价于[a-zA-Z])

[:blank:]用于匹配空格或制表符(等价于[\t ]注意的是,t后面有一个空格)

[:cntrl:]用于匹配ASCII码控制字符(ASCII031,再加上ASCII127)

[:digit:]用于匹配任意一个数字(等价于[0-9])

[:print:]用于匹配任意一个可打印字符

[:graph:][:print:]一样,但是不包括空格

[:lower:]用于匹配任意一个小写字母(等价于[a-z])

[:upper:]用于匹配任意一个大写字母(等价于[A-Z])

[:punct:]用于匹配既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符

[:space:]用于匹配任意一个空白符,包括空格(等价于[^\f\n\r\t\v ]v后面还有一个空格)

[:xdigit:]用于匹配任何一个十六进制数字(等价于[a-fA-F0-9])

POSIX字符类的使用举例:

[[:xdigit:]]可以用于匹配AF16进制的数字。需要注意的是,POSIX字符类必须括在[::]之间。外层的[]用于定义一个字符集合

 

重复匹配:

+用于匹配前一个字符一个或者多个,至少匹配一个,不匹配零个字符的情况。如果要匹配+本身这个字符,需要对该字符进行转义即\+用于表示“+”这个字符本身。

*用于匹配零个或多个字符,如果要匹配*本身,需要对该字符进行转义,即\*表示字符“*”本身。

?用于匹配一个字符的零个或者一个,最多不能超过一个。如果要匹配字符?本身,则需要对字符?进行转义,即\?表示匹配字符“?”本身。

{m}用于匹配前一个字符m次,且必须是m次,少一次都不能进行匹配,需要注意的是,要匹配字符“{”和字符“}”,需要对其进行转义,即\{\}用于匹配“{”和“}”字符本身。

{m,n}用于匹配前一个字符最少m次,最多n次。

{m,}用于匹配前一个字符至少m次,即匹配m次或理论上得无限次。

ps:需要注意的是,*+以及{m,}都是贪婪型的匹配,其在进行模式匹配的时候,会尽可能的从一个文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头碰到第一个匹配的为止。要使其在碰到文本的第一个匹配为止就结束匹配,则应当将*+以及{m,}变成懒惰匹配。变成懒惰匹配的方法是在*+以及{m,}之后加上一个?使其在遇到合适的匹配的时候,就结束模式的匹配。

 

贪婪型匹配的一个例子:

文本:This offer is not available to customers living in <B>AK</B> and <B>HI</B>

正则表达式:<[Bb]>.*</[Bb]>

其匹配的结果是<B>AK</B> and <B>HI</B>

正则表达式修改为<[Bb]>.*?</[Bb]>

其匹配的结果:<B>AK</B>      <B>HI</B>

 

 

位置匹配:

位置匹配用来解决在什么地方进行字符串匹配操作的问题。

\b用来匹配一个单词的开始或结尾。需要注意的是,如果想匹配一个完整的单词,则必须在需要进行匹配的单词前后均加上一个\b。例如:\bcat\b用于匹配单词cat,而无法匹配scatter。而且需要注意的是,\b只是对位置进行匹配,而不匹配任何字符。

\B用于表明不匹配一个单词的边界即字母数字下划线之间,或者非字母数字下划线之间

^用于匹配字符串的开头,即整个文本的开头。当要匹配字符^本身的时候,需要对其进行转义处理,即\^用于匹配字符“^”本身

$用于匹配字符串的结尾,即整个文本的结尾。当要匹配字符$本身的时候,需要对其进行转义处理,即\$用于匹配字符“$”本身


原创粉丝点击