码代码这么久,还没正经的总结过什么知识,闲来无事,就索性总结归纳下自己的正则水平,供自己以后复习巩固。

1.正则的捕获组

何为捕获组,就是正则中带有小括号内容的正则,这种正则默认是贪婪的,捕获且匹配的;

那贪婪、捕获且匹配又是什么意思?

举例来讲

/test(s)/.exec('testssssssss') 
(2) ["tests", "s", index: 0, input: "testssssssss", groups: undefined]
// [匹配结果, 捕获组1, 捕获组2, ...,  input: "testssssssss", groups: undefined]
/test(s)*/.exec('testssssssss') 
(2) ["testssssssss", "s", index: 0, input: "testssssssss", groups: undefined]
[匹配结果, 捕获组1, 捕获组2, ...,  input: "testssssssss", groups: undefined]
/test(s)?/.exec('testssssssss') 
(2) ["tests", "s", index: 0, input: "testssssssss", groups: undefined]
//可以看到?的匹配结果是一个s,说明这个?是贪婪的;正则一般默认都是贪婪的。

从例子1看,返回结果的第一个元素是匹配结果,结果中包含括号内的内容;第二个元素只是括号内的正则匹配的部分,这部分就是捕获部分。当捕获部分包含在匹配结果中的时候,这个捕获组就是匹配的;我们看下不捕获的时候的结果

/test(s)??/.exec('testssssssss') // 非贪婪模式
["test", undefined, index: 0, input: "testssssssss", groups: undefined]
/test(?=s)/.exec('testssssssss') // 捕获组不捕获
["test", index: 0, input: "testssssssss", groups: undefined]
//可以看到捕获组并没有捕获,可以默认这样的规则,捕获组以?开头即非捕获模式

正则的默认匹配方向是正向,那么正向预搜索就是非捕获的捕获组的应用

  • ?=为正向预搜索,代表缝隙右边必须满足定义的规则,但是只匹配不捕获保存,匹配结果不包含右侧的部分
  • ?:为正向预搜索,代表缝隙右边必须满足定义的规则,匹配结果包含右侧的部分,不捕获
  • ?!为正向预搜索,代表缝隙右边必须满足不符合定义的规则,但是只匹配不捕获保存,匹配结果不包含右侧的部分
/test(?:s)/.exec('testssssssss') 
["tests", index: 0, input: "testssssssss", groups: undefined]
/test(?!s)/.exec('testxxxx') 
["test", index: 0, input: "testxxxx", groups: undefined]

2.捕获组的反向引用

我们了解了捕获组的捕获,那么如果我们遇到了这样额一个场景

'testssaaa'写出其正则模式,并拿到其捕获组

/test(\S)?\1*(\S)?\2*/.exec('testssaaa');
["testssaaa", "s", "a", index: 0, input: "testssaaa", groups: undefined]

两个括号对应两个捕获组,分别为s和a,那么我们分别用\1,\2来表示对这两个捕获组的引用;

反向引用有很大的用处,假如你要指定字符串中某个片段的规则,那么可以尝试下反向引用

3.RegExp全局对象

举几个常见的属性

RegExp.$_
RegExp.$1
RegExp.$2

表示很简单:就是最近使用的一个正则的配置,依次为匹配结果、第一个捕获组、第二个捕获组

搭配String.prototype.replace

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);

4.捕获组搭配String.split

'testssaaa'.split(/test(s)/)
(3) ["", "s", "saaa"]

为什么返回的数组长度是3,为什么会包含一个s

其实看split的描述

字符串中删除,并将子字符串的数组返回。如果没有找到或者省略了分隔符,则该数组包含一个由整个字符串组成的元素。如果分隔符为空字符串,则将str转换为字符数组。如果分隔符出现在字符串的开始或结尾,或两者都分开,分别以空字符串开头,结尾或两者开始和结束。因此,如果字符串仅由一个分隔符实例组成,则该数组由两个空字符串组成。

如果分隔符是包含捕获括号的正则表达式,则每次分隔符匹配时,捕获括号的结果(包括任何未定义的结果)将被拼接到输出数组中。但是,并不是所有浏览器都支持此功能。