七、正则表达式编程

这里要掌握正则表达式怎么用,通常会有这么四个操作:

  • 验证
  • 切分
  • 提取
  • 替换

1. 四种操作

  • 验证

匹配本质上是查找,我们可以借助相关API操作:

  1. // 检查字符串是否包含数字
  2. let r = /\d/, s = "abc123";
  3. !!s.search(r); // true
  4. r.test(s); // true
  5. !!s.match(r); // true
  6. !!r.exec(s); // true
  • 切分
  1. "leo,pingan".split(/,/); // ["leo", "pingan"]
  2. let r = /\D/, s = "2019-03-16";
  3. s.split(r); // ["2019", "03", "16"]
  4. s.split(r); // ["2019", "03", "16"]
  5. s.split(r); // ["2019", "03", "16"]
  • 提取
  1. // 提取日期年月日
  2. let r = /^(\d{4})\D(\d{2})\D(\d{2})$/;
  3. let s = "2019-03-16";
  4. s.match(r); // ["2019-03-16", "2019", "03", "16", index: 0, input: "2019-03-16"]
  5. r.exec(s); // ["2019-03-16", "2019", "03", "16", index: 0, input: "2019-03-16"]
  6. r.test(s); // RegExp.$1 => "2019" RegExp.$2 => "03" RegExp.$3 => "16"
  7. s.search(r);// RegExp.$1 => "2019" RegExp.$2 => "03" RegExp.$3 => "16"
  • 替换
  1. // yyyy-mm-dd 替换成 yyyy/mm/dd
  2. "2019-03-16".replace(/-/g, "/");

2. 相关API注意

  • searchmatch 参数问题

这两个方法会把字符串转换成正则,所以要加转义

  1. let s = "2019.03.16";
  2. s.search('.'); // 0
  3. s.search('\\.'); // 4
  4. s.search(/\./); // 4
  5. s.match('.'); // ["2", index: 0, input: "2019.03.16"]
  6. s.match('\\.'); // [".", index: 4, input: "2019.03.16"]
  7. s.match(/\./); // [".", index: 4, input: "2019.03.16"]
  8. // 其他不用转义
  9. s.split('.');
  10. s.replace('.', '/');
  • match 返回结果的格式问题

match 参数有 g 会返回所有匹配的内容,没有 g 则返回标准匹配格式:

  1. let s = "2019.03.16";
  2. s.match(/\b(\d+)\b/); // ["2019", "2019", index: 0, input: "2019.03.16"]
  3. s.match(/\b(\d+)\b/g); // ["2019", "03", "16"]
  • test 整体匹配时需要使用 ^$
  1. /123/.test("a123b"); // true
  2. /^123$/.test("a123b"); // false
  3. /^123$/.test("123"); // true
  • split 的注意点

split 第二个参数是 结果数组的最大长度

  1. "leo,pingan,pingan8787".split(/,/, 2); // ["leo", "pingan"]

使用正则分组,会包含分隔符:

  1. "leo,pingan,pingan8787".split(/(,)/); // ["leo", ",", "pingan", ",", "pingan8787"]
  • 修饰符 | 修饰符 | 描述 | | :—-: | —- | | g | 全局匹配,即找到所有匹配的,单词是global。 | | i | 忽略字母大小写,单词是 ingoreCase。 | | m | 多行匹配,只影响 ^$,二者变成行的概念,即行开头和行结尾。单词是 multiline。 |