小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
  • 工作中常用正则表达式汇总

    工作中常用正则表达式汇总

    基本蕴含了工作中常用的正则表达式Examples符号含义.*?省略(.*?)显示[\S\s]*?连接省略(忽律换行符和空格)([\s\S]*?)连接显示([\u4e00-\u9fa5]+)只显示中文\d匹配随……
    293人已经看过了
您的位置:首页 > 前端开发 > Javascript > 正则表达式

正则表达式的捕获(分组)和反向引用以及案例

分类: 正则表达式62个赞

在正则表达式中,通过一对圆括号括起来的内容,我们就称之为“子表达式”。

捕获(分组)

在正则表达式中,子表达式匹配到相应的内容时,系统会自动捕获这个行为,

然后将子表达式匹配到的内容放入系统的缓存区中。我们把这个过程就称之为“捕获”。


正则表达式捕获示意图

在正则语法中,用“\1”来引用前面的捕获(使用子表达式匹配的结果)。用\2表示第二个捕获的内容….

反向引用

在正则表达式中,我们可以使用\n(n>0,正整数,代表系统中的缓冲区编号)

来获取缓冲区中的内容,我们把这个过程就称之为“反向引用”。

正则表达式反向引用示意图

捕获和反向引用demo:

匹配连续四个数字,第一和第二数字相同,第三和第四数字相同

	var str = '1122 3434 5566 7879 9887';
	// var res = str.match(/\d{4}/g);
	var res = str.match(/(\d)\1(\d)\2/g);  
	// var res = str.match(/(\d)\1(\d)\2/g);
	console.log(res);// [1122 , 5566]

匹配连续四个数字,第一和第三数字相同,第二和第四数字相同

	var res = str.match(/(\d)(\d)\1\2/g);
	console.log(res); //[3434]

匹配连续四个数字,第一和第三数字相同

	var res = str.match(/(\d)\d\1\d/g);
	console.log(res); //[3434 , 7879]

匹配连续四个数字,第一和第二数字相同,第三和第四数字相同,并将相同的数字只保留一个  1122   5566  12  56

	// var res = str.replace(/(\d)\1(\d)\2/g, 'aaaa');
	var res = str.replace(/(\d)\1(\d)\2/g, '$1$2');
	console.log(res);

禁止反向引用 (?:)

	var str = '1122 3434 5566 7879 9887';
	var res = str.match(/(?:\d)(\d)\1\d/g);
	console.log(res); //[9887]


匹配中文(utf-8编码)

案例1--你好世界

    var str = "你好,世界";
    var res = str.match(/[\u4E00-\u9FA5]/g);
    console.log(res);//array["你", "好", "世", "界"]
    var res = str.match(/[\u4E00-\u9FA5]{1}/g);
    console.log(res);//["你", "好", "世", "界"]
    var res = str.match(/[\u4E00-\u9FA5]{2}/g);
    console.log(res);//["你好", "世界"]

每个字符(中文、英文字母、数字、各种符号、拉丁文、韩文、日文等)都对应着一个Unicode编码。


查看Unicode编码,找到中文的部分,然后获取中文的Unicode编码的区间,就可以用正则匹配了。


前面我们用[a-z]表示小写字母,[0-9]表示数字,这就是一个范围表示,如果有一个数x能够表示第一个中文,有一个数y能够表示最后一个中文,那么[x-y]就可以表示所有的中文了。


中文的Unicode编码从4E00开始,到9FA5结束。


[\u4E00-\u9FA5]这个区间就能够表示中文。

完整的Unicode编码表:http://blog.csdn.net/hherima/article/details/9045861


案例2--解决结巴问题

	var str = "今今今天晚晚晚晚晚晚上吃吃吃吃吃吃鸡";
	//核心思路, 连续的重复的汉字,保留一个 (字符串替换)
	var res = str.replace(/([\u4E00-\u9FA5])\1+/g, '$1');
	console.log(res);



小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> 正则表达式的捕获(分组)和反向引用以及案例