js正则表达式分组

JavaScript 专栏收录该内容
44 篇文章 2 订阅

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"]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值