Martin

正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。(来自百度百科)


用处

基本上很多编程语言中都会应用到正则表达式,不同语言对它的支持有所不同。(下面我们来介绍它在php语言的基础与应用)

在php里,一个正则表达式由分隔符(可以是除了字母,数字,反斜线以及空白符以为的任何字符如:/,!,#,|,%,~等)和表达式(由一些特殊字符和非特殊组成的字符串如^[a-z0-9]+\w?)和修饰符(拥有关闭或开启某种功能或者模式如i,m,u等)


元字符

元字符是正则表达式中具有特殊意义的字符。

元字符 意义
\w 匹配字母或数字或下划线
\d 匹配数字
\s 匹配任意空白符
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
- 表示范围
[] 匹配括号中的任意一个字符
*、+、? 量词
. 匹配任意字符(除换行符/n外)

请看下面一些例子:

  • 匹配以a开头的单词\ba\w+\b

    表示单词以\b为开始处,再是“a”字母,之后是“\w+”表示一个到任意多字母或数字,最后是\b是单词的结束处,那么匹配到的可以是以下几种:aaaaaabacbbb等。

  • 匹配多个中间可有空格数字\d+\s?

    \d匹配数字,+表示量词(重复一次或更多次),\s匹配空白符,表示0次到1次所以空白符可有可无,且最多只能一个空白符,可匹配:1,1 22,22,14 4,5 6等。

  • 匹配abcdef中其中一个字符[abcdef]或者[a-f]

    []匹配括号内的单个字符,那么上面例子就可匹配abcdef,而在括号内-表示范围。也称为字符组,[?!.]可匹配.(字符组简单,但是一定要弄清楚什么时候转义),可以指定字符范围[0-9](跟\d的含义一样)

  • 匹配任意字符.*?

    .元字符可以匹配除换行符以外的字符,*?表示重复任意次,但尽可能的少重复(懒惰匹配模式)。

  • 起始和结束元字符^\d{5,11}$,^\d{5,11},\d{5,11}$,\d{5,11}

    ^\d{5,11}$表示匹配起始和结束位置都是数字且连续5到11位(整个字符串都是数字)
    ^\d{5,11} 表示匹配起始位置是数字且连续5到11位
    \d{5,11}$ 表示匹配起始位置是数字且连续5到11位
    \d{5,11} 表示匹配连续的5到11位数字
    前三个表达式结果只可能有一个匹配结果,而最后一个可以有多种匹配成功的结果,因为一行只可能有一个开始位置跟起始位置。


量词

前面已经提到过几个元字符表示量词,也就是说字符的次数,以下列出量词意义

量词 意义
* 重复0次或更多次
+ 重复1次或更多次
重复0次或1次
{n,m} 重复n次到m次
{n,} 重复n次或更多次
{n} 重复n次

比如表达式\(?0\d{2}[)-]?\d{2,8}可匹配(021)82,029-88888888,02889\(?表示对特殊字符(进行转义,且可有可无,0\d{2}表示数字0后接两位数字,[)-]?表示字符组,匹配括号内的)-(由于中括号内不会造成歧义,所以一般不需加反斜线\转义),且可有可无,最后的\d{2,8}则表示可有2到8个数字组成。


转义

转义就是在对正则表达式中特殊字符加上反斜线\,从而当做普通字符,比如?,+,*,.,[],()等元字符在正则表达式中加上反斜线\(\*,\?,\.匹配到就是*,?,.)。

$str = '23\*w.w';
$reg = '#[\.\*]#';
preg_match_all($reg,$str,$match);
var_dump($match);

以上代码运行结果是匹配到了.*#[\.\*]#在元字符中括号内匹配单个字符.*,因为是元字符所以对它们进行转义。现在我们把括号内的反斜线\去掉变成#[.*]#,运行结果跟前面一样,这是因为在[]字符组内匹配单个字符,且不会造成歧义,可以不需要\([^ ]‘^’在字符组表示反义,非,取反的意思,如果想要当做普通字符则需要加\);


反义

在正则表达式中有时我们需要进去排除字符组或者取反,以下有几个取反元字符的含义

反义 意义
\W 匹配任意不是字母或数字或下划线的字符
\D 匹配任意不是数字的字符
\S 匹配任意不是空白符的字符
[^a ] 匹配除a以外的任意字符
[^sdeq] 匹配除sdeq这个几个字符以为的任意字符

<a[^>]+> 可匹配<a href="baidu.com">.
反义是比较少用到的,因为在无形中会扩大匹配范围,例如我们想要匹配不要以字母开头的字符串,一般都会使用[^a-zA-Z],而不会使用\W(它还排除了数字跟下划线)。


正则表达式基础语法先总结到这里啦,它在实际应用中还是蛮多的,主要是平时多多练习总结,后续会总结正则表达式的分组,分支以及环视,伪静态的应用等。