在线正则:飞一下
我们先看一个案例,然后引申正则表达式的结构
假设匹配的字符:aBaaa
正则表达式:/a{5}/i //是匹配字母a五个,且忽略大小写。
正则表达式的结构:
1、定界符号:常用为/ / ,其他的可以为||、{}、!!
2、原子:如a,最小的一个匹配单位(放在定界符中),在一个正则表达式中,至少要有一个原子。
3、元字符:如{5},元字符不能单独使用的。修饰原子,是用来扩展原子功能的和限定功能的。(写在定界符号内)
4、模式修正符号:如i,修正,对模式(正则)修正用,(写在定界符号外面,写在右边)
一、原子:
1、打印字符和非打印字符
打印字符:(a-z A-Z 0-9 !@#¥%)
非打印字符(比如回车\r、换行\n等)
2、转义字符
一、可以将有意义的字符转成没有意义的原子字符(将有意义变成原子,如$)
二、可以将没有意义的字符转成有意义的原子。t ,\t(tab键)
三、a-z A-Z 0-9 _所以没有意义的字符,加上转义也没有意义。@都是可加可不加
3、自己定义原子表
[13579] 任意一个字符是其中一个就可以被匹配
[^a-zA-Z] -从哪到哪区间范围,^除了列表中的
4、所有的数字,所以的字,所有的空白,所有的字母,特殊字符
- \d 代表任意一个数字 [0-9]
- \D 代表任意一个非数字 [^0-9]
- \w 代表任意一个字 a-z A-Z 0-9 _ [a-zA-Z_]
- \W 代表任意一个非字 除了a-z A-Z 0-9 之外的所以字符。比如(*&%¥) [^a-zA-Z]
- \s 代表空白 回车,水平制表,换行,换页,垂直制表 [\r\t\n\f\v]
- \S 代表非空白 [^\r\t\n\f\v]
5、点(.)能代表所有的
二、元字符
注意:不能再正则表达式中单独使用,用来修饰原子的不能再正则表达式中单独使用,用来修饰原子的
- *用来修饰其前面的原子可以出现0个1个或多个 (任意次){0,}
- +用来修饰其前面的原子可以出现1次或多次,不能没有至少要出现一次{1,}
- ?用来修饰其前面的原子可以出现0次或1次 {0,1}
- {m} m=3 用来修饰其前面的原子只能出现m次,多一次和少一次都不可以
- {m,} m=3 用来修饰其前面的原子只能出现大于或等于m次
- {m,n} {2,5} 用来修饰其前面的原子只能出现个数在n和m之间,包括n和m个
- | 是或的关系,表示它两边的原子,只要有一个出现就可以,但是,|的优先级是最低的
- ^ 和\A 表示必须以什么开始,这个必须写正则表达式的最前面
- \b 单词边界
- \B 不是单词边界
$str = "this is island";
$reg = "/\bis\b/"; //此时匹配的是中间的is
$reg = "/\bis\B/"; //此时匹配的是island里面的is
$reg = "/\Bis\b/"; //此时匹配的是this里面的is
三、模式修正符号(单个字符)
作用:模式修正符合可以修正正则表达式的解释
我们来看下有哪些修正符号
- i 不区分大小写(默认是区分大小写的)
- m 可以视为多行,在使用^ 或者 $ 这两个符号时,每一行满足都可以。(默认视为一行处理)。
- s 修正正则表达式中的 . 可以匹配换行符号。如果不加s ,.* 是不能匹配到换行符
- x 修正正则表达式,可以省略空白。
- U (.,.+)正则表达式比较贪婪,不过这样会有兼容性,php可以支持,但js里面不支持。解决贪婪性的办法。使用.? .+?的组合也可以解决贪婪性。但.*?不能和U一起使用,这相当于负负得正,取消了贪婪模式。
模式修正符的使用注意
1、模式修正符号要写在定界符号外,放在右边
$reg = "/google/i";
2、模式修正符号,一个字符就是一个功能,可以组合使用
$reg = "/google/ieU";
根据上面看到的,我们可能有一个疑问。到底".?"和".*?" 中的"?"有什么区别?
1、".?" 中"?" 出现在原子后,代表的是任意一个字符出现0次或1次
2、".*?" 中"?" 出现在元字符后,代表匹配的是任意多个字符,且取消贪婪模式
四、()的作用
第一个作用:必变优先级别
$reg = "/ne|red/"; //匹配的是n 或者 red
$reg = "/(ne|re)d/"; //匹配的是need 或者 red
第二个作用:将小原子,变成大原子
$reg = "/(abc|bcd)/";//表示这一段是abc、bcd二者之一均可,顺序也必须一致
第三个作用:子模式,整个表达式是一个大的模式,小括号中是每个独立的子模式
$str = "<a>hello</a><a>world</a>";
//匹配第一个a标签的内容
$reg = "/<a>(.*)<\/a>/"; //.* 匹配的结果是hello</a><a>world
第四个作用:反向引用
// 例子:要求:日期格式中前面用的是“-”,后面必须为“-”。前面是“/”,后面也必须为“/”。
$str = "2014-12-01";
$reg = "/\d{4}(-|\/)\d{2}\\1\d{2}/";
这里面的\1 就是(-|/)匹配到的值。
注意:
当使用preg_match函数时,只能用\1来引用子模式,而不能使用 ${1}来引用。
preg_replace函数可以用到${1}来引用。
$str = "2014/12-01";
$reg = "/\//";
echo preg_replace($reg,'${1}-',$str);
(?:-|/)如果小括号中加了?: 则表示不作为反向引用来使用,且后面引用不到。