写在前面:正则表达式的用法看过很多遍,但总是记不住,又回头再学,这次决定自己写一篇文章。
先来看看一个正则表达式可能会有哪些组成部分:
-
匹配字符:
- 简单字符
- 特殊字符
-
边界标志
- ^ $
- /b /B
-
量词
- * + ?
- {}
-
与或非
- 连着写就是与
- 或:[]、|
- 非:[^ ]
-
分组:()
-
修饰符:i、 g 、 m
匹配字符
简单字符: 例如 /abc/
特殊字符: 例如 /ab\w/
特殊字符往往是一连串简单字符的集合:常见的转义字符有:
| 特殊字符 | 作用 |
|---|---|
| \w | 匹配单词和数字 |
| \s | 匹配空格 |
| \d | 匹配数字 |
| . | 匹配所有 |
| \1 | 与第一个匹配分组的匹配值相同 |
另外: \W 是 \w 的 补集,它们的作用是反的, \W的作用是: 匹配所有非单词和数字 同理,\S是 \s的 补集,作用是 匹配所有非空格字符
边界标志
^ 指匹配结果必须包含字符串的头部 $ 指匹配结果必须包含字符串的尾部 \b 指匹配的结果必须是某个单词的边界(单词与单词间被逗号或空格 等字符分隔) \B 指匹配的结果不能是某个单词的边界
量词
量词很好理解
*: 代表0个或多个
+:代表至少一个
?: 代表0个或1个
{}:数量区间, 如{6,12} 指6到12位之间
量词只对前面的匹配规则有用,如 /abc*/ 指的是c有0个或多个.
与或非
与:连着写的情况下,就是与, 如/abc/ 指的就是匹配结果是abc, ab不行。
或: 存在a或者存在b,可以写a|b ,但如果有多个字符或操作,用[], 如 [abcd]
非:[^ abc] 指定就是除开abc任意字符
分组
像RegExp.exec() 和 String.match() 等方法,返回的结果是一个数组,数组默认只有一个值, 即索引为0 项为匹配的结果, 如果表达式里有被() 括起来的分组,那么数组就会有第二第三项。
分组的引用:$1 、 /1:这在匹配规则中使用
var result = s.replace(/([aeiou])/g,"$1$1")
将匹配到的aeiou替换成 aa ee ii oo uu
修饰符
i: 不区分大小写
g: 全局匹配: 匹配所有结果,而不是匹配到第一个结果后停下
m: 多行匹配: 结合^ 或者 $ 一起使用,默认情况下,一个字符串是否换行都只有一个行首和行尾,如果执行多行匹配,那么就可以有多个行首和行尾(在换行处产生)
关于正则的函数
正则对象
reg.test(str) // 返回值为boolean reg.exec(str) // 返回值为数组,执行全局匹配时,要写一个判断函数
var str = `212-555-1234 915-412-1333`;
var regular = /(\d{3})-\d{3}-\d{4}/g;
// regular正则对象有一个lastIndex属性,如果执行全局匹配,每匹配一次就修改一次,代表从这个index的下一个字符开始匹配
while ((reg = regular.exec(str)) !== null) {
console.log(reg);
}
数组对象
str.match(reg) // 如果不是全局匹配,作用和结果都跟reg.exec(str)一样,如果是的话,那么它返回的数组包括所有的匹配结果,不包括分组(想要全局匹配又要获得分组的话,用reg.exec(str));
str.replace(string/reg, string) // 这个string可以是普通字符串,也可以是带$分组的字符串
str.split(string/reg) // 分割字符串返回数组