本说对正则还是有点认识,基本上简单的自己还能摸索出来,最近看了高性能JavaScript以后,发现对正则的正式还是如此的浅薄,先不说深入,把基础的先记录下来再说。
1、元字符标记
(1)、字符对应马甲
字符 | 等同于 | 描述 |
---|---|---|
. | [^\n\r] | 除了换行和回车之外的任意字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [ \t\n\x0B\f\r] | 空白字符 |
\S | [^ \t\n\x0B\f\r] | 非空白字符 |
\w | [a-zA-Z_0-9] | 单词字符(所有的字母) |
\W | [^a-zA-Z_0-9] | 非单词字符 |
(2)、特殊字符
字符 | 正则 | 描述 |
---|---|---|
\t | /\t/ | 制表符 |
\n | /\n/ | 制表符 |
\r | /\r/ | 回车符 |
\f | /\f/ | 换页符 |
\a | /\a/ | alert字符 |
\e | /\e/ | escape字符 |
\cX | /\cX/ | 与X相对应的控制字符 |
\b | /\b/ | 与回退字符 |
\v | /\v/ | 垂直制表符 |
\0 | /\0/ | 空字符 |
(3)、量词
代码 | 类型 | 描述 |
---|---|---|
? | 软性量词 | 出现零次或一次 |
* | 软性量词 | 出现零次或多次(任意次) |
+ | 软性量词 | 出现一次或多次(至道一次) |
{n} | 硬性量词 | 对应零次或者n次 |
{n,m} | 软性量词 | 至少出现n次但不超过m次 |
{n,} | 软性量词 | 至少出现n次(+的升级版) |
这里就出现了难点,因为回溯就出现在这里,贪婪跟惰性匹配也在这里。
回溯先不谈,先来说贪婪跟惰性。
贪婪就是一次性匹配完整个字符,如果不符合或者后面继续有字符需要匹配,然后它很不情愿的吐出一个字符,来试着匹配,如果不适合,继续吐出第二个。
惰性就是一次之匹配这个字符串后的一个字符,如果这个字符不匹配,接着匹配这个字符串的下一个字符。
经典例子:
var str = '1234ing1234ing1234';
var re1 = /.*ing/g;//贪婪
var re2 = /.*?ing/g;//惰性
alert(str.match(re1)+"");//1234ing1234ing
alert(str.match(re2)+"");//1234ing,1234ing
关于回溯具体也举不到实例,有好的实例拿出来,一切就好说了。
(4)、边界
边界 | ||
---|---|---|
正则 | 名称 | 描述 |
^ | 开头 | 注意不能紧跟于左中括号的后面 |
$ | 结尾 | |
\b | 单词边界 | 指[a-zA-Z_0-9]之外的字符 |
\B | 非单词边界 |
( [ { \ ^ $ | ) ? * + .这几个字符是正则表达式一部分,在匹配这些字符时,需要转义。
(6)、分组
1、分组
到目前为止,我们只能一个字符到匹配,虽然量词的出现,能帮助我们处理一排密紧密相连的同类型字符。但这是不够的,下面该轮到小括号出场了,中括号表示范围内选择,大括号表示重复次数。小括号允许我们重复多个字符。
2、反向引用
反向引用标识由正则表达式中的匹配组捕获的子字符串。每个反向引用都由一个编号或名称来标识,并通过“\编号”表示法进行引用。
3、候选
在分组中插入管道符(“|”),把它划分为两个或多个候多项。
4、非捕获分组
并不是所有分组都能创建反向引用,有一种特别的分组称之为非捕获性分组,它是不会创建反向引用。反之,就是捕获性分组。要创建一个非捕获性分组,只要在分组的左括号的后面紧跟一个问号与冒号就行了。
5、前瞻
前瞻与后瞻其实都属于零宽断言,但javascript不支持后瞻。
零宽断言 | ||
---|---|---|
正则 | 名称 | 描述 |
(?=exp) | 正向前瞻 | 匹配exp前面的位置 |
(?!exp) | 负向前瞻 | 匹配后面不是exp的位置 |
(?<=exp) | 正向后瞻 | 匹配exp后面的位置不支持 |
(?<!exp) | 负向后瞻 | 匹配前面不是exp的位置不支持 |
(7)、字符集合
通过[]的方式来达到字符集合的方式。例如[\s\S]任意字符[0-9]数字[a-zA-Z]大小写字符[\u4e00-\u9fa5]中文字符等等
(8)、标志
正则表达式的匹配模式支持下列3个标志:
1)g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
2)i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
3)m:表示多行模式(multiline),即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项;
2、正则表达式的相关方法与属性
3、稍微复杂的正则表达式的例子