方法总览
-
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);
评论