七、正则表达式编程
这里要掌握正则表达式怎么用,通常会有这么四个操作:
- 验证
- 切分
- 提取
- 替换
1. 四种操作
- 验证
匹配本质上是查找,我们可以借助相关API操作:
// 检查字符串是否包含数字let r = /\d/, s = "abc123";!!s.search(r); // truer.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('.'); // 0s.search('\\.'); // 4s.search(/\./); // 4s.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。 |
