|
|
定界符
使用与perl兼容的正则表达式,通常都需要将模式表达式放入定界符之间;
- / /<\/\W+>/
- # #模式表达式#
- ! !模式表达式!
- {} {模式表达式}
- | |模式表达式|
复制代码
原子
正则表达式的最基本组成单位,每个模式中至少有一个原子
1、普通字符作为原子
- '/5/' --用于匹配字符串中是否有5这个字符出现
- '/php/' --用于匹配字符串中是否有php字符出现
复制代码 2、特殊字符和元字符作为原子(“'”、“"”、“+”、“*”、“.”),必须转义
- '/\./' --用于匹配字符串中是否有应该问的“.”出现
- '/\<br \/\>/' --用于匹配字符串中是否有html标签<br />标记字符串出出现
复制代码 3、非打印字符作为原子:在字符串中的格式控制符号,如空格、回车、制表符号
- /\cx/ --匹配有x指明的控制字符,如\cM匹配一个Control-M或回车符,x的值必须为A~Z 或a~z之一,否则c将视为一个原义的'c'字符
- /\f/ --匹配一个换页符。 等价于\x0c和cL
- /\n/ --匹配一个换行符。等价于\x0a和cJ
- /\r/ --匹配一个回车符。等价于\x0d和cM
- /\t/ --匹配一个制表符。等价于\x09和cI
- /\v/ --匹配一个垂直制表符。等价于\x0b和cK
- '/\n/' --匹配win系统是否有回车换行出现
- '/\r\n/' --匹配Linux系统是否有回车换行出现
复制代码 4、使用通用字符类型走位原子
- '/\d/' --匹配任意一个十进制数字,等价于[0-9]
- '/\D/' --匹配任意一个除十进制数字以外的字符,等价于[^0-9]
- '/\s/' --匹配任意一个空白字符,等价于[\f\n\r\v]
- '/\S/' --匹配除空白字符以外的任何一个字符,等价于[^\f\n\r\v]
- '/\w/' --匹配任意一个数字、字母、或下划线,等价于[0-9a-zA-Z_]
- '/\W/' --匹配除数字、字母、或下划线的任意一个字符,等价于[^0-9a-zA-Z_]
复制代码 5、自定义原子表([])作为原子,可以定义一组彼此地位平等的原子,且从原子表中仅选择一个原子进行匹配
- '/[apj]sp/' --可匹配asp、php、jsp
- '/[^apj]sp/' --可匹配除asp、php、jsp三种以外的的字符串、如xsp、ysp、zsp
- '/0[xX][0-9a-fA-F]+/' --匹配一个简单的十六进制数,都0x2f、0X3AE、0x4aB等
复制代码
元字符
用于构建正则表达式的具有特殊含义的字符,元字符不能单独出现,必须是用来修饰原子的
- * --匹配0次1次或多次其前的原子
- + --配1次或多次其前的原子
- ? --匹配0次1次其前的原子
- . --匹配除换行符外的任意一个字符
- | --匹配两个或多个分支选择
- {n} --表示其前面的原子恰好出现n次
- {n,} --匹配其前面的原子出现少于n次
- {n,m} --匹配其前面的原子出现至少n次,至多m次
- ^或\A --匹配输入字符串的开始位置(或在多行模式下的开头,即紧随一换行符之后)
- $或\Z --匹配输入字符串的结束位置(或在多行模式下的结尾,即紧随一换行符之前)
- \b --匹配单词的边界
- \B --匹配除单词的边界以外的部分
- [] --匹配[]中指定的任意一个原子
- [^] --匹配除[]中指定的原子以外的任意一个字符
- () --匹配其整体作为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子
- 注意:^ 在[]中是匹配开始位置,[^]就是匹配除中指定的原子以外的任意一个字符
复制代码 1、限定符,用来指定正则表达式的一个给定原子必须要出现多少次才能满足匹配
- “*”、“+”、“?”、“{n}”、“{n,}”、“{n,m}”,其中“*”和“+”是贪婪的,他们会尽可能多的匹配字符
- '/a\s*b/' --“/s” 表示空白原子,可以匹配a和b之间没有空白、有一次、或多个空白的情况(0、多)
- '/a\d+b/' --可以匹配a和b之间有一个或多个数字的情况,如:a2b、a4567b等(1、多)
- '/a\W?b/' --可以匹配a和b之间有1特殊字符个或0个特殊字符,如ab、a#b、a%b等(0、多)
- '/ax{4}b/' --可以匹配a和b之间必须有4个x的字符串,如axxxxb(必须有n次)
- '/ax{2,}b/' --可以匹配a和b之间至少有2个x的字符串,如axxb、axxxxxxb等(至少有n次)
- '/ax{2,4}b/' --可以匹配a和b之间至少有2个x的字符串、至多有4个x的字符串,如axxb、axxxb、axxxxb(至少n次至多m次)
复制代码 2、边界限制,用来限定字符串或者单词的边界范围,以获得更准确的匹配结果。
元字符“^”或“\A”和“$”或“\Z”、分别指的是字符串的开始和结束。“\b”用于描述字符串中每个单词的前或后边界,与之相反的元子符“\B”表示非单词边界
- 例如 有一个字符串“this is a test”,使用的边界限制如下所示:
- '/^this/' --匹配此字符串是否是以字符串“this”开始的,匹配成功
- '/test$/' --匹配此字符串是否是以字符串“test”结束的,匹配成功
- '/\bis\b/' --匹配此字符串中是否是含有单词“is”,因为在字符串“is”两边都含有边界
- '/\Bis\b/' --查找字符串“is”时,左边不能为边界而右边必须有边界,如“this”匹配成功
复制代码 3、句号(.)
可以匹配目标中任何一个字符,包括不可打印字符。但不匹配换行符(默认情况下),相当于“[^\n]”(UNIX系统)或“[^\r\n]”(Windows系统),如果设定了模式修正符号“s”,则远点也会匹配换行符。处理圆点 与 处理音调符“^”和美元“$”是完全独立的,唯一的关系就是他们都涉及换行符。
通常可以使用“.*?”或“.+?”组合来匹配除换行符以外的任何字符串。例如,模式“/<b>.*?b<\/b>/”可以匹配“<b>”标签开始,“</b>”标签结束的任何不包括换行符的字符串。
- /a.b/ --可以匹配a和b之间有任意一个字符的字符串,例如axb、ayb、azb等
复制代码 4、模式选择符(|)
竖线“|”用来分割多选一模式,在正则表达式中匹配两个或更多的选择之一,元字符竖线“|”的优先级是最低的。
- 例如:“LAMP|J2EE”表示可以匹配“LAMP”也可以匹配“J2EE”
复制代码 5、模式单元
模式单元是使用元字符“()”将多个原子组成大的原子,被当作一个单元独立使用,一个模式单元中的表达式将被优先匹配
- '/(very )*good/' --可以匹配good、very good、very very good、very very very ... good 等
复制代码 6、后向引用
7、模式匹配的优先级
通常优先级是从左到右进行
不同优先级的运算由高到低排名如下
- \ --转义字符
- ()、(?:)、(?=)、[] --模式单元和原子表
- *、+、?、{n}、{n,}、{n,m} --重复匹配
- ^、$、\b、\B、\A、\Z、 --边界限制
- | --模式选择
复制代码
模式修正符
模式 修正符号在正则表达式定界符之外使用(最后一个斜线“/”之后),可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作的某些功能,可以组合使用,增强了正则表达式的处理能力。
- i --在模式进行匹配时不区分大小写
- m --将字符串视为多行。默认的正则开始“^”和结束“$”将目标字符串作为单一的一“行”字符(甚至其中包含有换行符也是如此)。如果在修饰符中加上“m”,那么开始和结束将会指字符串的每一行,每一行的开头就是“^”,结尾就是“$”
- s --如果设置了此修正符,模式中的圆点元字符“.”匹配所有字符,也包括换行符,即将字符串视为单行,换行符作为普通字符看待
- x --模式中的空白忽略不计,除非它已经被转义
- e --TODO
- U --TODO
- D --TODO
复制代码
|
|