使用正则的场景

方法总览

  • RegExp.prototype.test

  • RegExp.prototype.exec[× 需要 while 遍历,尽量少用,用 match/matchAll 代替 ]

  • String.prototype.match

  • String.prototype.matchAll

  • String.prototype.replace

  • String.prototype.replaceAll

  • String.prototype.split

  • String.prototype.search

方法详情

RegExp.prototype.test(String):Boolean, 正则表达式与指定的字符串是否匹配

  • 匹配就返回 true,不匹配就返回 false
1let str = 'hello world!';
2let result = /^hello/.test(str);
3console.log(result);
4// true
  • 如果正则表达式设置了全局标志 连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串
1var regex = /foo/g;
2
3// regex.lastIndex is at 0
4regex.test('foo'); // true
5
6// regex.lastIndex is now at 3
7regex.test('foo'); // false

RegExp.prototype.exec(String):[Array|null], 在一个指定字符串中执行一个搜索匹配

  • 如果匹配成功返回一个数组, 并更新正则表达式对象的  lastIndex属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。
  • 如果匹配失败,exec()  方法返回  null,并将  lastIndex  重置为 0 。
  • 如果模式修正符带有 g,需要 while 遍历,多次执行才能得到所有匹配
 1var myRe = /ab*/g;
 2var str = 'abbcdefabh';
 3var myArray;
 4while ((myArray = myRe.exec(str)) !== null) {
 5  var msg = 'Found ' + myArray[0] + '. ';
 6  msg += 'Next match starts at ' + myRe.lastIndex;
 7  console.log(msg);
 8}
 9//output
10//Found abb. Next match starts at 3
11//Found ab. Next match starts at 9
12//返回myArray结构如
13[
14    0: "abb" ---第n次万全匹配
15    1: "a"   ---第n次括号匹配
16    groups: undefined
17    index: 0
18    input: "abbcdefabh"
19    length: 1
20]

String.prototype.match/matchAll (RegExp):Array, 返回一个字符串匹配正则表达式的结果

  • 如果传入一个非正则表达式对象参数,则会隐式地使用  new RegExp(obj)  将其转换为一个  RegExp
  • 模式修正符 g 的区别
    方法 带 g 不带 g
    match 1.完整匹配的所有结果,无捕获组 2.第一个完整匹配及其相关的捕获组
    matchAll 3.所有完整匹配的结果及分组捕获组的迭代器 ×
 1//---1.match带g(×要匹配全部,建议使用matchAll)---
 2var regexp = /t(e)(st(\d?))/g;
 3var str = 'test1test2';
 4
 5str.match(regexp);
 6// Array ['test1', 'test2']
 7
 8//---2.match不带g---
 9var regexp = /t(e)(st(\d?))/g;
10var str = 'test1test2';
11
12str.match(regexp);
13//Array ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
14
15//---3.matchAll 必须带g(可以替代exec方法)---
16var regexp = /t(e)(st(\d?))/g;
17var str = 'test1test2';
18let array = [...str.matchAll(regexp)];
19
20//返回二维数组
21array[0];
22// ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
23array[1];
24// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]

String.prototype.replace/replaceAll (RegExp|substr, newSubStr|function), 替换字符串

  • 该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串

  • 第一个参数的区别

    方法 字符串 正则带 g 正则不带 g
    replace 替换第一个匹配到的 替换所有匹配到的(× 建议语义化 replaceAll 替代) 2.替换第一个匹配到的
    replaceAll 替换所有匹配的 3.替换所有匹配到的 ×
 1//---2 replace 正则不带g---
 2var re = /h/;
 3var str = "John Smith";
 4var newstr = str.replace(re, "?");
 5// Jo?n Smith
 6console.log(newstr);
 7
 8//---3 replaceAll---
 9var re = /h/g;
10var str = "John Smith";
11var newstr = str.replaceAll(re, "?");
12// Jo?n Smit?
13console.log(newstr);
  • 第 2 个参数为 newSubStr 时,用$1-99表示第 n 个括号匹配的字符串,如果不存在第 n 个分组,那么将会把匹配到到内容替换为字面量。比如不存在第 3 个分组,就会用“$3”替换匹配到的内容;“$&” 插入匹配的子串;“$`”插入当前匹配的子串左边的内容;“$'” 插入当前匹配的子串右边的内容
1//交换一个字符串中两个单词的位置
2var re = /(\w+)\s(\w+)/;
3var str = "John Smith";
4var newstr = str.replace(re, "$2, $1");
5// Smith, John
6console.log(newstr);
  • 第 2 个参数为函数时,函数参数为 function(match,p1,p2,…pn,offset,string),match 匹配到的字符串;p1,p2…pn 相当于$1-$99 括号匹配;offset 匹配到的子字符串在原字符串中的偏移量;string 被匹配的原字符串
1function replacer(match, p1, p2, p3, offset, string) {
2  // p1 is nondigits, p2 digits, and p3 non-alphanumerics
3  //match= abc12345#$*%
4  return [p1, p2, p3].join(' - ');
5}
6var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
7console.log(newString);  // abc - 12345 - #$*%

String.prototype.search (RegExp):index, RegExp 在字符串中首次匹配项的索引

  • 返回首次匹配项的索引,未匹配则返回  -1
  • 类似于正则表达式的test():Boolean方法,'ssass'.indexOf('a')方法; 当要了解更多匹配信息时,可使用  match()方法
1var str = "hey JudE";
2var re = /[A-Z]/g;
3var re2 = /[.]/g;
4console.log(str.search(re)); // returns 4, which is the index of the first capital letter "J"
5console.log(str.search(re2)); // returns -1 cannot find '.' dot punctuation

String.prototype.split ([separator[, limit]] ):Array, 用 separator 把字符串分割成数组

  • separator  可以是一个字符串或正则表达式
1var myString = "Hello 1 word. Sentence number 2.";
2var splits = myString.split(/(\d)/);
3//[ "Hello ", "1", " word. Sentence number ", "2", "." ]
4console.log(splits);
  • separator如果是数组会转化为字符串
1const myString = 'ca,bc,a,bca,bca,bc';
2
3const splits = myString.split(['a','b']);
4// myString.split(['a','b']) is same as myString.split(String(['a','b']))
5
6console.log(splits);  //["c", "c,", "c", "c", "c"]
  • limit 为一个整数,限定返回的分割片段数量
1var myString = "Hello World. How are you doing?";
2var splits = myString.split(" ", 3);
3//['Hello', 'World.', 'How']
4console.log(splits);

前端学习路线图
配一台电脑

评论