七、正则表达式编程
这里要掌握正则表达式怎么用,通常会有这么四个操作:
- 验证
- 切分
- 提取
- 替换
1. 四种操作
- 验证
匹配本质上是查找,我们可以借助相关API操作:
// 检查字符串是否包含数字
let r = /\d/, s = "abc123";
!!s.search(r); // true
r.test(s); // true
!!s.match(r); // true
!!r.exec(s); // true
- 切分
"leo,pingan".split(/,/); // ["leo", "pingan"]
let r = /\D/, s = "2019-03-16";
s.split(r); // ["2019", "03", "16"]
s.split(r); // ["2019", "03", "16"]
s.split(r); // ["2019", "03", "16"]
- 提取
// 提取日期年月日
let r = /^(\d{4})\D(\d{2})\D(\d{2})$/;
let s = "2019-03-16";
s.match(r); // ["2019-03-16", "2019", "03", "16", index: 0, input: "2019-03-16"]
r.exec(s); // ["2019-03-16", "2019", "03", "16", index: 0, input: "2019-03-16"]
r.test(s); // RegExp.$1 => "2019" RegExp.$2 => "03" RegExp.$3 => "16"
s.search(r);// RegExp.$1 => "2019" RegExp.$2 => "03" RegExp.$3 => "16"
- 替换
// yyyy-mm-dd 替换成 yyyy/mm/dd
"2019-03-16".replace(/-/g, "/");
2. 相关API注意
search
和match
参数问题
这两个方法会把字符串转换成正则,所以要加转义
let s = "2019.03.16";
s.search('.'); // 0
s.search('\\.'); // 4
s.search(/\./); // 4
s.match('.'); // ["2", index: 0, input: "2019.03.16"]
s.match('\\.'); // [".", index: 4, input: "2019.03.16"]
s.match(/\./); // [".", index: 4, input: "2019.03.16"]
// 其他不用转义
s.split('.');
s.replace('.', '/');
match
返回结果的格式问题
match
参数有 g
会返回所有匹配的内容,没有 g
则返回标准匹配格式:
let s = "2019.03.16";
s.match(/\b(\d+)\b/); // ["2019", "2019", index: 0, input: "2019.03.16"]
s.match(/\b(\d+)\b/g); // ["2019", "03", "16"]
test
整体匹配时需要使用^
和$
/123/.test("a123b"); // true
/^123$/.test("a123b"); // false
/^123$/.test("123"); // true
split
的注意点
split
第二个参数是 结果数组的最大长度:
"leo,pingan,pingan8787".split(/,/, 2); // ["leo", "pingan"]
使用正则分组,会包含分隔符:
"leo,pingan,pingan8787".split(/(,)/); // ["leo", ",", "pingan", ",", "pingan8787"]
- 修饰符
| 修饰符 | 描述 |
| :—-: | —- |
|
g
| 全局匹配,即找到所有匹配的,单词是global
。 | |i
| 忽略字母大小写,单词是ingoreCase
。 | |m
| 多行匹配,只影响^
和$
,二者变成行的概念,即行开头和行结尾。单词是multiline
。 |