1. 基础部分可以参考
https://www.runoob.com/jsref/jsref-obj-regexp.html(包含修饰符、方括号、元字符、量词、RegExp 对象方法、支持正则表达式的 String 对象的方法、RegExp 对象属性)
MDN-js正则表达式
2. 正则表达式中分组
捕获型
一个捕获型分组是一个被包围在括号中的正则表达式分支
var text="2589";
var matches=text.match(/(\d(\d)\d)\d/);
console.log(matches);//["2589", "258", "5", index: 0, input: "2589", groups: undefined]
text.match(/(\d(\d)\d)\d/g)//["2589"]
非捕获型
非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。
var text="2589";
var matches=text.match(/(?:\d(\d)\d)\d/);
console.log(matches);//["2589", "5", index: 0, input: "2589", groups: undefined]
text.match(/(?:\d(\d)\d)\d/g)//["2589"]
3. 贪婪性匹配
如果只有一个量词,表示趋向于进行贪婪性匹配,即匹配尽可能多的副本直至达到上限。
如果这个量词附加一个后缀?,则表示趋向于非贪婪性匹配,即只匹配必要的副本就好。一般情况下最好坚持使用贪婪性匹配。
/* regexObj.exec(str) */
//如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。
//如果匹配失败,exec() 方法返回 null。
//紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用 /\d+?/ 则只会匹配到 "1"。
//match无/g、matchAll、exec、split可以像以下方式进行捕获(先返回完全匹配成功的文本做为数组第一项,然后将捕获的填充到数组后面)
//matchAll返回一个迭代器,有无/g都返回捕获的内容,match中/g全局匹配不返回捕获组中的内容
var re = /quick\s(brown).+?(jumps)/i;//+后面的?代表非贪婪(匹配尽量少的字符)
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
console.log(result)//["Quick Brown Fox Jumps", "Brown", "Jumps", index: 4, input: "The Quick Brown Fox Jumps Over The Lazy Dog", groups: undefined]
//(?:x)匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号
//如果表达式是 /foo{1,2}/,{1,2} 将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2} 会应用于整个 'foo' 单词
var re = /quick\s(brown).+?(?:jumps)/gi;
var results = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
console.log(results)//["Quick Brown Fox Jumps", "Brown", index: 4, input: "The Quick Brown Fox Jumps Over The Lazy Dog", groups: undefined]
\1 匹配的是 所获取的第1个()匹配的引用。例如,/(\d)\1/ 匹配两个连续数字字符。如33aa 中的33
\2 匹配的是 所获取的第2个()匹配的引用。
例如,/(\d)(a)\1/ 中,\1必须匹配和第一个一样的数字。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以。
/(\d)(a)\2/ 中\2必须是a,如,8aa被匹配,但8ab,7a7不会被匹配。
/((\d)(a))\1\2\3/中\1是最外层括号匹配到的,\2是(\d)匹配到的,\3是a。
var reg1='/\d/g';//字符串不是正则表达式,匹配不到
var reg2=/\d/g;//正则表达式,可以匹配到,但是不能是变量
new RegExp('\d','g');//这个是错误的 /d/g
new RegExp('\\d','g');//正确 /\d/g
new RegExp(reg2,'m');//可以有变量 /\d/m
var str='12332144556678978978911233444';
str.match(/(\d)\1/g);//["33", "44", "55", "66", "11", "33", "44"]
str.match(/(\d)\1{2}/g);//["444"]
str.match(/(\d)(\d)(\d)\1\2\3/g);//["789789"]
str.match(/(\d)(\d)(\d)\3\2\1/g);//["123321"]
str.match(/(\d)(\d)(\d)(\1\2\3)+/g);//["789789789"]
str.match(/(\d\d\d)\1+/g);//["789789789"]
str.match(/(\d)\1(\d)\2/g);//["4455", "3344"] 这块没匹配出5566,不知道用正则如何解决,哪位大牛知道回复下。所以最后只想到了用js解决
str.match(/(\d)\1((\d)\3)+/g);//["445566", "3344"]
str.match(/(\d)\1(\d)(\d)\3/g);//["11233"]
//匹配有序的三位数字
str.match(/(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}\d/g);//["123", "678", "789", "789", "123"]
//str是字符串,reg是正则表达式。返回所有匹配项数组
function getmatch(str,reg){
let res=new Set();
let tempStr="";
let index=0;
do{
tempStr=str.substr(index).match(reg);
if(tempStr!==null){
res.add(tempStr[0])
}
++index;
}while (tempStr!==null)
return [...res]
}
console.log(getmatch(str,/(\d)\1(\d)\2/));//["4455", "5566", "3344"]
console.log(getmatch('123456',/(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2}\d/));//["123", "234", "345", "456"]