正则表达式,又称规则表达式。(英语: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
是单词的结束处,那么匹配到的可以是以下几种:aaaaa
,ab
,acbbb
等。
匹配多个中间可有空格数字:
\d+\s?
\d
匹配数字,+
表示量词(重复一次或更多次),\s
匹配空白符,?
表示0次到1次所以空白符可有可无,且最多只能一个空白符,可匹配:1
,1 22
,22
,14 4
,5 6
等。匹配abcdef中其中一个字符:
[abcdef]或者[a-f]
[]匹配括号内的单个字符,那么上面例子就可匹配
a
,b
,c
,d
,e
,f
,而在括号内-
表示范围。也称为字符组
,[?!.]可匹配?
,!
,.
(字符组简单,但是一定要弄清楚什么时候转义),可以指定字符范围[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
(它还排除了数字跟下划线)。
正则表达式基础语法先总结到这里啦,它在实际应用中还是蛮多的,主要是平时多多练习总结,后续会总结正则表达式的分组,分支以及环视,伪静态的应用等。