Skip to content

Latest commit

 

History

History
56 lines (44 loc) · 2.35 KB

7. js正则表达式分组.md

File metadata and controls

56 lines (44 loc) · 2.35 KB

7. js正则表达式分组

1. 基础部分可以参考 https://www.runoob.com/jsref/jsref-obj-regexp.html(包含修饰符、方括号、元字符、量词、RegExp 对象方法、支持正则表达式的 String 对象的方法、RegExp 对象属性)

2. 正则表达式中 分组: \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"]