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

所谓后向引用:一个正则表达式使用了圆括号()导致相关匹配将存储到一个临时缓冲区中,可以使用‘\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);

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

				
时间: 2024-12-05 17:39:23

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

正则表达式中圆括号的用法

var rgExp = /(^\D*[0-9])/; var str = "this is fun 01 stuff"; var resu = str.match(rgExp); document.writeln(resu); 结果为: this is fun 0,this is fun 0 如果使用圆括号的模式在匹配完成后,会记住这一匹配.被记住的值保存在结果数组中,此例中的结果中间有一个逗号,表明它们是数组的两项.第一个结果是匹配,第二个来自圆括号模式保存的值.如果不用圆括号括着整

正则表达式中/g的用法

转载:http://blog.myspace.cn/e/405164495.htm 解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结一下. 总结1:附件参数g的用法 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义.我们详细叙述: 1)对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次

正则表达式语法与正则表达式在iOS中的常见用法

一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式达到字符串的复杂控制. 二.正则表达式的语法 看一个过滤纯数字的例子 - (BOOL)validateNumber:(NSString *) textString { NSString* number=@"^[0-9]+$"; NSPredicate *numberPre = [NSPre

Java中正则表达式的几种用法

多数内容转载自:http://www.jb51.net/tools/regex.htm ,有改动 用到了java.util.regex包: 1. 验证 Pattern pattern = Pattern.compile("^[1][3-8]\\d{9}$"); Matcher matcher = pattern.matcher("13565765432"); System.out.println(matcher.matches()?"手机号输入合法&quo

正则表达式与正则表达式在ios中的常见用法

一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式达到字符串的复杂控制. 二.正则表达式的语法 看一个过滤纯数字的例子 - (BOOL)validateNumber:(NSString *) textString{    NSString* number=@"^[0-9]+$";    NSPredicate *numberPre = [

如何解决python的re模块group、groups与findall遇见正则表达式中分组"()"后产生的”眩晕反应“

转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9244783.html 直接先上例子 >>> re.search('(book+)', 'mebookbookme').groups() ('book',) >>> re.search('(book+)', 'mebookbookme').group() 'book' >>> re.search('(book)+', 'mebookbookme').group

Linux中的括号用法

一.Linux中的小括号(也叫圆括号)"( )"的用法 1.单小括号() 1)数组赋值或者初始化数组: 2)子Shell赋值:小括号中的内容会开启一个子shell独立运行:括号中以分号连接,最后一个命令不需要:各命令和括号无需空格:3)实现多条命令集合:新开多条命令来执行,各个命令之间用分号隔开,最后一个命令必须要分号来隔开:4)与"$"结合实现命令替换:等同于cmd 扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此

Python正则表达式Regular Expression基本用法

资料来源:http://blog.csdn.net/whycadi/article/details/2011046   直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表达式re模块的基本函数. (1)findall函数的用法 findall(rule,target[,flag])是在目标字符串中找到符合规则的字符串.参数说明:rule表示规则,target表示目标字符串,[,flag]表示的是规则选项.返回的结果是一个列表.若没找到符合的,是一个空列表. 如: 因

正则表达式中各种字符的意义

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的. 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 3.1 普通字符 由所有那些未显式指定为元字符的