所謂后向引用:一個正則表達式使用了圓括號()導致相關匹配將存儲到一個臨時緩沖區中,可以使用‘\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);
后記--為什么我寫的博客這么丑,難為各位了,小博有空一定優化一下哈