正则表达式详解
正则表达式的简介
正则表达式的语法
正则表达式:描述了一种字符串匹配的模式,可以用来检查一个字符串是否行货某种子串,将匹配的子串做替换或者从某个串中取出符合某个条件的子串等
普通字符
普通字符:普通字符指包括没有显示指定为元字符的所有可打印或不可打印的字符,这包括所有大写或小写字母 、所有数字、所有标点符号或一些其他符号。
非打印字符
非打印字符也可以是正则表达式的组成部分,下表列出非打印字符的转义序列:
| 字符 | 描述 | 实例 | | ---- | :-------------------: | | \cx | 匹配由x指明的控制字符 | \cM 匹配一个Control - M 或者回车符。x的值必须为A-Z 或 a-z。否则,将c视为一个原义的 ‘c’字符 | | \f | 匹配一个换页符 | 等价于 \xOc 和 \cL | | \n | 匹配一个换行符 | 等价于 \xOa 和 \cJ | | \r | 匹配一个回车符 | 等价于 \xOd 和 \xM | | \s | 匹配任何空白字符 | 包括空格、制表符、换页符 等价于[\f\n\r\t\v]。 | | \S | 匹配非空字符 | 等价于[^\f\n\r\t\v] | | \t | 匹配一个制表符 | 等价于 \xO9 和\cI | | \v | 匹配一个垂直制表符 | 等价于 \xOb和 \cK |
模式修正符
//修正符:i 不区分大小写的匹配; //如:"/abc/i"可以与abc或aBC或ABc等匹配; //修正符:g表示全局匹配 //修正符:m 将字符串视为多行,不管是那行都能匹配; 例://模式为:$mode="/abc/m"; //要匹配的字符串为:$str="bcefg5e\nabcdfe" //注意其中\n,换行了;abc换到了下一行; //$str和$mode仍可以匹配,修正符m使得多行也可匹配; //修正符:s 将字符串视为单行,换行符作为普通字符;
例://模式为:$mode="/pr.y/"; //要匹配字符串为:$str="pr\ny"; //两者不可匹配; . 是除了换行以外的字符可匹配; //修改下模式为:$mode="/pr.y/s"; //其中修正符s将\n视为普通字符,即不是换行; //最后两者可以匹配; //修正符:x 将模式中的空白忽略; //修正符:A 强制从目标字符串开头匹配;
例://$mode="/abc/A"; //可以与$str="abcsdfi"匹配, //不可以与$str2="sdsdabc"匹配; //因为$str2不是以abc开头; //修正符:D 如果使用$限制结尾字符,则不允许结尾有换行;
例://模式为:$mode="/abc$/"; //可以与最后有换行的$str="adshabc\n"匹配; //元子符$会忽略最后的换行\n; //如果模式为:$mode="/abc/D", //则不能与$str="adshabc\n"匹配, //修正符D限制其不可有换行;必需以abc结尾; //修正符:U 只匹配最近的一个字符串;不重复匹配;
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,类似于一个保留的关键字,下表列出了正则表达式的特殊字符
特别字符 | 描述 | 例子 |
---|---|---|
$ | 匹配输入字符串结尾的位置 | 'b$'则是匹配以b结尾的字符串 |
() | 标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用 | ‘(abc)’,则是匹配 |
* | 匹配前面子表达式的零次或多次 | ‘a*’,则是匹配 |
+ | 匹配前面的子表达式一次或多次 | ‘a+’ |
. | 匹配除换行符 \n 之外的任何单字符 | |
[ ] | 标记一个中括号表达式 | |
? | 匹配前面的子表达式零次或一次 ,或指明一个非贪婪限定符 | |
\ | 将下一个字符标记为特殊字符、或原义字符、或向后引用、或八进制转义符 | 要匹配‘\’则需要‘\’ |
^ | 匹配输入字符串的开始位置,在方括号内则是取反 | |
标记限定符的开始 | ||
| | 指明两项之间的一个选择 |
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多次才能满足匹配。有 *
或 +
或 ?
或 { n } { n,}
{ n,m }
共 6种
正则表达式的限定符有:
字符 | 描述 | 实例 |
---|---|---|
* | 匹配前面的子表达式零次或多次。 | ‘zo*’ 则匹配‘z’ 以及‘zoo’ ,等价于 {0,} |
+ | 匹配前面的子 表达式一次或多次 | ‘zo+’ ,则是匹配‘zo’ 以及‘zoo’ ,但是不能匹配‘z’ 相当于{1,} |
{n} | 匹配前面的子表达式n次 | ‘re{2}’ ,则是匹配‘bee’ |
{n,} | 匹配前面的子表达式至少n次 | |
{n,m} | n,m 都为非负整数,其中m>=n ,最少匹配n次,最多匹配m次 | ‘a{1,3}’ 将匹配‘aab’ 和 ‘abbc’ |
注:
*、+和限定都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们后面加上一个?就可以实现非贪婪或最小匹配
定位符
定位符将正则表达式固定到行首和行尾,限定符有‘$’,‘^’,‘\b’,‘\B’
选择
用圆括号将所有项括起来,相邻的选择项之间用|分割。但用圆括号有副作用,就是相关的匹配会被缓存,此时可以用?:放在第一个选项前消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?= 和 ?!,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式位置来匹配搜索字符串,后者则是负向预查,在任何不匹配该正则表达式模式的位置来匹配搜索字符串。