溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

正則表達(dá)式關(guān)鍵詞的示例分析

發(fā)布時(shí)間:2021-12-29 16:17:43 來源:億速云 閱讀:192 作者:小新 欄目:網(wǎng)絡(luò)管理

這篇文章將為大家詳細(xì)講解有關(guān)正則表達(dá)式關(guān)鍵詞的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

子模式 

在使用正則表達(dá)式的時(shí)候,我們經(jīng)常會(huì)使用()把某個(gè)部分括起來,稱為一個(gè)子模式。

子模式有Capturing和Non-Capturing兩種情況。

Capturing指獲取匹配or捕獲匹配 ,是指系統(tǒng)會(huì)在幕后將所有的子模式匹配結(jié)果保存起來,供我們查找或者替換。如后向引用的使用;

Non-Capturing指非獲取匹配or非捕獲匹配 ,這時(shí)系統(tǒng)并不會(huì)保存子模式的匹配結(jié)果,子模式的匹配更多的只是作為一種限制條件使用,如正向預(yù)查,反向預(yù)查,正向肯定預(yù)查,正向否定預(yù)查等。

后向引用(也叫反向引用)

使用"\數(shù)字"代表前面某個(gè)子模式的匹配內(nèi)容。

我們使用正則表達(dá)式,在很多場景下的作用是為了查找和替換。在查找時(shí),使用后向引用來代表一個(gè)子模式,語法是"\數(shù)字",而在替換中,語法是"$數(shù)字"。數(shù)字 表示這里引用的是前面的第幾個(gè)子模式??蓞⒖济东@分組

預(yù)查、正向、反向、肯定、否定

預(yù)查

包括正向預(yù)查,反向預(yù)查,細(xì)分了還各自有肯定預(yù)查和否定預(yù)查。

特點(diǎn):

所有的預(yù)查都是非獲取匹配,不消耗字符。也就是說,在一個(gè)匹配發(fā)生后,在匹配字符之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。

正向

匹配后面跟著的東西是否等于/不等于

反向

匹配前面跟著的東西是否等于/不等于

肯定

匹配后面/前面跟著的東西是否等于

否定

匹配后面/前面跟著的東西是否不等于

正向肯定預(yù)查

(?=pattern) 預(yù)測后面的字符串必須匹配上pattern

先給一個(gè)簡單的例子:

匹配英文句子中帶ing的單詞,但是不要ing。
varcon="coming soon,going gogogo"varreg = /\b[\w]+(?=ing\b)/g;//匹配帶ing的單詞,但是不要ing。注意:如果ing后不加\b,類似于goingabc也會(huì)匹配。console.log(con.match(reg));

結(jié)果匹配到["com", "go"]。先匹配單詞邊界\b,然后+匹配前面多次或者一次,然后到這個(gè)正向預(yù)查,(?=ing)表示先向后探測,看看有沒有ing。

如果有,則把前面的匹配出來;如果沒有,則光標(biāo)往后移一位,繼續(xù)探測。

這個(gè)過程就是正向預(yù)查:預(yù)先判斷為某個(gè)值。然后匹配到的東西不包含這個(gè)元素,這里也就是ing。

官方原話是該匹配不需要獲取供以后使用,是一個(gè)非捕獲匹配。

正向否定預(yù)查

(?!pattern) 預(yù)測后面的字符串必須匹配不上pattern

反向肯定預(yù)查

(?<=pattern) 預(yù)測前面的字符串必須匹配上pattern

反向否定預(yù)查

(?<!pattern) 預(yù)測前面的字符串必須匹配不上pattern

反向預(yù)查,pattern長度必須是固定的,也就是說pattern中不能出現(xiàn)諸如*.等這類字符使得pattern匹配的長度不固定;但是正向沒有這個(gè)要求。

示例 

考慮這樣一個(gè)應(yīng)用情景:對于一個(gè)大的數(shù)值,比如35689412,西方國家習(xí)慣三位一個(gè)量級(jí),中間以逗號(hào)隔開,方便一眼看出大小,也即是35,689,412。那么現(xiàn)在有一堆數(shù),請用正則表達(dá)式完成替換,替換成諸如35,689,412的格式。

題目分析:也就是從右往左數(shù),每隔三個(gè)數(shù),如果前面還有數(shù)的話就在前面加個(gè)逗號(hào)。也就是找到這些特定的位置,在該位置處加上“,”。

varnumber = "82359123650916359816359";varregex = /(?<=\d)(?=(\d{3})+$)/g;
number.replace(regex,",");

正則表達(dá)式關(guān)鍵詞的示例分析

例子中使用的正則表達(dá)式:/(?<=\d)(?=(\d{3})+$)/g;

(\d{3})+ 作用:匹配3個(gè)數(shù)字 6個(gè)數(shù)字 或9個(gè)數(shù)字……

(\d{3})+$   作用:匹配3個(gè)數(shù)字結(jié)尾, 6個(gè)數(shù)字結(jié)尾 或9個(gè)數(shù)字結(jié)尾……

(?=(\d{3})+$)  作用:匹配后面跟著 “3個(gè)數(shù)字結(jié)尾, 6個(gè)數(shù)字結(jié)尾 或9個(gè)數(shù)字結(jié)尾…… ” 的位置

(?<=\d)  作用:匹配前面跟著一個(gè)數(shù)字的位置,這就確保不會(huì)把“123,456” 轉(zhuǎn)成“,123,456”

該正則表達(dá)式全由預(yù)查結(jié)構(gòu)組成,沒有匹配任何字符(如果用match()函數(shù)看的話,結(jié)果是多個(gè)空字符串,看下圖),但是卻匹配了一堆位置。再用:replace(",”),即可完成問題要求。$的作用可以優(yōu)先匹配行末

正則表達(dá)式關(guān)鍵詞的示例分析

捕獲&非捕獲

需要注意的點(diǎn):與消費(fèi)不消費(fèi)字符 不能混為一談

捕獲:

可以通過一個(gè)正則表達(dá)式的模式,或者部分模式兩邊添加圓括號(hào)將導(dǎo)致相關(guān)匹配存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū)中,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲(chǔ)。緩沖區(qū)編號(hào)從 1 開始,最多可存儲(chǔ) 99 個(gè)捕獲的子表達(dá)式。

舉例:

1varstr='2016-05-01';2varpattern=/(\d{4})-(\d{2})-(\d{2})/;3str.match(pattern)4str.replace(pattern,'$2$3$1')

正則表達(dá)式關(guān)鍵詞的示例分析

非捕獲:

如果我們不想捕獲我們的文本,可以使用非捕獲元字符 '?:'、'?=' 或 '?!' ,這種分組正則表達(dá)式引擎不會(huì)捕獲它所匹配的內(nèi)容即不會(huì)為非捕獲型分組分配組號(hào),也就是不放在我們的內(nèi)存當(dāng)中,這樣也能提高我們的性能。

貪婪與懶惰

貪婪匹配

當(dāng)正則表達(dá)式中包含能接受重復(fù)的量詞(指定數(shù)量的代碼,例如*,{5,12}等)時(shí),通常的行為是匹配盡可能多的字符。考慮這個(gè)表達(dá)式:a.*b,它將會(huì)匹配最長的以a開始,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會(huì)匹配整個(gè)字符串a(chǎn)abab。這被稱為貪婪匹配。

懶惰匹配

有時(shí),我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的量詞都可以被轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個(gè)問號(hào)?。這樣.*?就意味著匹配任意數(shù)量的重復(fù),但是在能使整個(gè)匹配成功的前提下使用最少的重復(fù)。現(xiàn)在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話,它會(huì)匹配aab和ab。

(?:pattern)匹配檢驗(yàn)

(?:pattern)則跟預(yù)查那四種匹配模式根本就不是一類東西,只是長得比較像,他們的最大區(qū)別就是:(?:pattern)是匹配字符,也就是會(huì)消耗字符。

(?:pattern)是和(pattern)相對應(yīng)的,他們的區(qū)別在于:(pattern)是獲取匹配,pattern內(nèi)容會(huì)出現(xiàn)在匹配結(jié)果的中;(?:pattern)是非獲取匹配。

(?:pattern)相比(pattern)不會(huì)改變正則表達(dá)式的處理方式,只是這樣的組匹配的內(nèi)容不會(huì)像(pattern)那樣被捕獲到某個(gè)組里面

例:

var reg1=/windows(?:2000|NT|98)/i
var reg2=/windows(2000|NT|98)/i
var str='windows2000'

str.match(reg1) // ["windows2000", index: 0, input: "windows2000"]
str.match(reg2) // ["windows2000", "2000", index: 0, input: "windows2000"]
reg1.test(str)    //true
reg2.test(str)    //true

可以注意到 第一個(gè)正則匹配返回的結(jié)果中沒有子匹配的返回內(nèi)容

reg1和reg2匹配"windows2000"字符串都可以完全被匹配到。
?:的結(jié)果中:只是2000沒有作為單獨(dú)的匹配結(jié)果放到組里。

正則表達(dá)式關(guān)鍵詞的示例分析

位置

匹配一個(gè)位置,也就是不獲取字符串,不消費(fèi)字符

表.位置指定的符號(hào)
代碼/語法說明
\b匹配單詞的開始或結(jié)束
^匹配字符串的開始
$匹配字符串的結(jié)束
\B匹配不是單詞開頭或結(jié)束的位置
(?=exp)匹配后面跟著exp的位置,也就是exp前面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<=exp)匹配前面跟著exp的位置,也就是exp后面的位置
(?<!exp)匹配前面不是exp的位置

關(guān)于“正則表達(dá)式關(guān)鍵詞的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI