javascript 正则表达式的组、全局、RegExp.exec()和string.match()区别详解编程语言

前言

javascript的正则表达式,基本用法可以参考这个 ;在会了基本用法后,有几个概念一定要注意,组、全局、RegExp.exec和String.match的区别。

全局

全局是标志是否全局匹配,通俗点说就是后一次匹配从上次匹配处往后匹配。比如

var reg = /.at/g; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str));

结果

[ '1at', index: 0, input: '1at,2at,3at' ] 
[ '2at', index: 4, input: '1at,2at,3at' ] //本次匹配,从1at后边往后匹配 
[ '3at', index: 8, input: '1at,2at,3at' ] //本地匹配,从2at后边往后匹配 
null

对应的我们去掉全局匹配

var reg = /.at/; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str));
[ '1at', index: 0, input: '1at,2at,3at' ] //每次匹配都是从最开始搜寻 
[ '1at', index: 0, input: '1at,2at,3at' ] 
[ '1at', index: 0, input: '1at,2at,3at' ] 
[ '1at', index: 0, input: '1at,2at,3at' ]

组主要用来获取匹配结果,首先匹配全局正则,然后匹配第1个子表达式、第2个子表达式,依次类推….

var reg = /(.a)t/; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str));

首先匹配.at ,然后再匹配 .a, 所以每次匹配有两个

[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ]

全局&&组

学完了全局和组,再来个复杂点的正则

var reg = /(.a)t/g; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str));
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '2at', '2a', index: 4, input: '1at,2at,3at' ] 
[ '3at', '3a', index: 8, input: '1at,2at,3at' ] 
null

RegExp.exec() VS String.match()

正则表达式的exec()与字符串的match()很像,

不带全局表达式

不带全局标志时,两者一样

var reg = /(.a)t/; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
 
console.log("--------------------------"); 
 
console.log(str.match(reg));
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
-------------------------- 
[ '1at', '1a', index: 0, input: '1at,2at,3at' ]

全局表达式

带全局表达式时,string.match()一次返回表达式、子表达式匹配结果,但不返回所以及输入项;

var reg = /(.a)t/g; 
var str ="1at,2at,3at"; 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
console.log(reg.exec(str)); 
 
console.log("--------------------------"); 
 
console.log(str.match(reg));
[ '1at', '1a', index: 0, input: '1at,2at,3at' ] 
[ '2at', '2a', index: 4, input: '1at,2at,3at' ] 
[ '3at', '3a', index: 8, input: '1at,2at,3at' ] 
null 
-------------------------- 
[ '1at', '2at', '3at' ]

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20291.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论