首页 > 代码库 > 正则表达式中圆括号的用法--也叫后向引用

正则表达式中圆括号的用法--也叫后向引用

所谓后向引用:一个正则表达式使用了圆括号()导致相关匹配将存储到一个临时缓冲区中,可以使用‘\n‘来访问其中的缓冲区,其中n为一个标识特定缓冲区的一位或两位十进制数,表达式中有过对()缓冲区将会有多个结果
当然可以使用非捕获元字符 ?: , ?=  , ?! 来忽略对相关匹配的保存

问题: 如果不忽略这种缓冲区保存会有什么影响,什么时候要忽略保存?

答:正则表达式() 的用法,叫后向引用,也叫反向引用,就是将正则表达式的匹配结果临时存储起来,供以后调用
 
 例1:

var num = "1234 5678";
var newNum = num.match(/(\d{4}) (\d{4})/);
console.log(RegExp.$2,RegExp.$1); 5678 1234

 
 例2:

var num = "1234 5678";
var newNum = num.match(/(?:\d{4}) (\d{4})/);
console.log(RegExp.$2,RegExp.$1); 5678 空


例3: 也可以在表达式中直接使用’\n‘ 取缓存的结果

var num = "dotor dogdog";
var newNum = /(?:dot)or (dog)\1$/.test(num);
console.log(newNum); //true
console.log(RegExp.$1); //dog

 
可以看出是将缓存结果是从正则的左到右将匹配()的结果,从$1开始到$99存起

也就是说如果后面我们不用到这个缓存结果,我们可以使用非捕获模式(?: );这在使用“或”的时候
是很有用的。例如:‘industr(?:y|ies)‘ ,就是一个比’industry|industries‘ 更简略的表达式

--------------------------------------------------------------------------------华丽丽的分割线------------------------------------------------------------------------------------

了解完捕获元之后,我们再来了解了解这两个正反预查:

?= 正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
?! 负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串

上面的概念可能很难看懂,我喜欢用例子来令自己心悦诚服:


?= 正向预查,也叫正向前瞻 。例如:/Windows(?=95|98|NT|2000)/ 能匹配“Windows 2000中的Windows” 但不能匹配“Windows 3.1” 中的windows 。
?! 反向预查,取结果刚好相反。能匹配“Windows 3.1中的Windows” 但不能匹配“Windows 3.1”的Windows。

正向预查与反向预查不消耗字符。一开始我不懂这个是啥意思,直到我在网上看到一位大牛的例子,瞬间醍醐灌顶………………

var text = "abc";
var reg = /a(?=b)bc/;
var reg2 = /a(b)bc/;

var result = reg.test(text);
var result2 = reg2.test(text);

console.log(result); //true
console.log(result2); //false


可以看出正向匹配没有消耗掉字符b,后面还可以匹配上b 。

 

最后,留一个解析地址url的正则,如果这个都摸懂了,估计,你就真的懂后向引用,正反向预查了


var url = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu#top";

var parse = url.match(/^(?:([a-z]+):\/\/)?([\w-]+(?:\.[\w-]+)+)?(?::(\d+))?([\w-\/]+)?(?:\?((?:\w+=[^#&=\/]*)?(?:&\w+=[^#&=\/]*)*))?(?:#([\w-]+))?$/i);

console.log(parse);

 

后记--为什么我写的博客这么丑,难为各位了,小博有空一定优化一下哈



 

正则表达式中圆括号的用法--也叫后向引用