溫馨提示×

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

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

JavaScript正則表達(dá)式之貪婪模式的示例分析

發(fā)布時(shí)間:2021-09-02 10:05:45 來源:億速云 閱讀:165 作者:小新 欄目:互聯(lián)網(wǎng)科技

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

貪婪模式:

在使用修飾匹配次數(shù)的特殊符號(hào)時(shí),有幾種表示方法可以使同一個(gè)表達(dá)式能夠匹配不同的次數(shù),比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數(shù)隨被匹配的字符串而定。這種重復(fù)匹配不定次數(shù)的表達(dá)式在匹配過程中,總是盡可能多的匹配

非貪婪模式:

在修飾匹配次數(shù)的特殊符號(hào)后再加上一個(gè) "?" 號(hào),則可以使匹配次數(shù)不定的表達(dá)式盡可能少的匹配,使可匹配可不匹配的表達(dá)式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強(qiáng)" 模式。如果少匹配就會(huì)導(dǎo)致整個(gè)表達(dá)式匹配失敗的時(shí)候,與貪婪模式類似,非貪婪模式會(huì)最小限度的再匹配一些,以使整個(gè)表達(dá)式匹配成功。

var regex = /\d{2,5}/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );
// => ["123", "1234", "12345", "12345"]

其中正則 /d{2,5}/,表示數(shù)字連續(xù)出現(xiàn) 2 到 5 次。會(huì)匹配 2 位、3 位、4 位、5 位連續(xù)數(shù)字。 但是其是貪婪的,它會(huì)盡可能多的匹配。你能給我 6 個(gè),我就要 5 個(gè)。你能給我 3 個(gè),我就要 3 個(gè)。 反正只要在能力范圍內(nèi),越多越好。

橫向模糊匹配

橫向模糊指的是,一個(gè)正則可匹配的字符串的長(zhǎng)度不是固定的,可以是多種情況的。 其實(shí)現(xiàn)的方式是使用量詞。譬如 {m,n},表示連續(xù)出現(xiàn)最少 m 次,最多 n 次。 比如正則 /ab{2,5}c/ 表示匹配這樣一個(gè)字符串:第一個(gè)字符是 "a",接下來是 2 到 5 個(gè)字符 "b",最后是字符 "c"。

var regex = /ab{2,5}c/g;
var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log( string.match(regex) );
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]

縱向模糊匹配

縱向模糊指的是,一個(gè)正則匹配的字符串,具體到某一位字符時(shí),它可以不是某個(gè)確定的字符,可以有多種 可能。 其實(shí)現(xiàn)的方式是使用字符組。
譬如 [abc],表示該字符是可以字符 "a"、"b"、"c" 中的任何一個(gè)。 比如 /a[123]b/ 可以匹配如下三種字符串: "a1b"、"a2b"、"a3b"。

var regex = /\d{2,5}?/g;
var string = "123 1234 12345 123456";
console.log( string.match(regex) );
// => ["12", "12", "34", "12", "34", "12", "34", "56"]
其中 /\d{2,5}?/ 表示,雖然 2 到 5 次都行,當(dāng) 2 個(gè)就夠的時(shí)候,就不再往

多選分支

一個(gè)模式可以實(shí)現(xiàn)橫向和縱向模糊匹配。而多選分支可以支持多個(gè)子模式任選其一。 具體形式如下:(p1|p2|p3),其中 p1、p2 和 p3 是子模式,用 |(管道符)分隔,表示其中任何之一。 例如要匹配字符串 "good" 和 "nice" 可以使用 /good|nice/。

var regex = /good|nice/g;
var string = "good idea, nice try.";
console.log( string.match(regex) );
// => ["good", "nice"]

但有個(gè)事實(shí)我們應(yīng)該注意,比如我用 /good|goodbye/,去匹配 "goodbye" 字符串時(shí),結(jié)果是 "good"

var regex = /good|goodbye/g;
var string = "goodbye";
console.log( string.match(regex) );
// => ["good"]

而把正則改成 /goodbye|good/,結(jié)果是:

var regex = /goodbye|good/g;
var string = "goodbye";
console.log( string.match(regex) );
// => ["goodbye"]

也就是說,分支結(jié)構(gòu)也是惰性的,即當(dāng)前面的匹配上了,后面的就不再嘗試了。

反向引用

比如要寫一個(gè)正則支持匹配如下三種格式

2020-02-25
2020/02/25
2020.02.25

var regex = /\d{4}(-|\/|.)\d{2}(-|\/|.)\d{2}/;
var string1 = "2020-06-12";
var string2 = "2020/06/12";
var string3 = "2020.06.12";
var string4 = "2020-02/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // true

其中 / 和 . 需要轉(zhuǎn)義。雖然匹配了要求的情況,但也匹配 "2016-06/12" 這樣的數(shù)據(jù)。

假設(shè)我們想要求分割符前后一致怎么辦?此時(shí)需要使用反向引用:

var regex = /\d{4}(-|\/|.)\d{2}\1\d{2}/;
var string1 = "2020-06-12";
var string2 = "2020/06/12";
var string3 = "2020.06.12";
var string4 = "2020-02/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // false

注意里面的 1,表示的引用之前的那個(gè)分組 (-|/|.)。不管它匹配到什么(比如 -),1 都匹配那個(gè)同 樣的具體某個(gè)字符。

我們知道了 1 的含義后,那么 2 和 3 的概念也就理解了,即分別指代第二個(gè)和第三個(gè)分組。

使用例子

字符串 trim 方法模擬

function trim(str) {
 return str.replace(/^\s+|\s+$/g, '');
}

表示一個(gè) 16 進(jìn)制字符,可以用字符組 [0-9a-fA-F]。 其中字符可以出現(xiàn) 3 或 6 次,需要是用量詞和分支結(jié)構(gòu)。 使用分支結(jié)構(gòu)時(shí),需要注意順序。 正則如下

var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
var string = "#ffbbad #Fc01DF #FFF #ffE";
console.log( string.match(regex) );
// => ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]

上面內(nèi)容就結(jié)束了,下面是其他網(wǎng)友的補(bǔ)充可以參考一下

var regExp = /8.*8/;
var str = "8google8 8google8 8google8";

上面例子,是貪婪模式,其實(shí)是用了重復(fù)(區(qū)間)匹配的正則表達(dá)式都為貪婪模式

前瞻模式是指某個(gè)匹配后面必須跟著某個(gè)字符串,例子如下

var regExp = /goo(?=gle)/;
var strOne = google;
var strTwo = googoo;

定語(yǔ)式 返回匹配的是 后面是帶 gle 的;

捕獲性分組和非捕獲性分組:例子如下:

var regExp = /(google)\s(2020)/;
var str = "google 2020";

返回的 是一組數(shù)組[ google 2020,google,2020]

var regExp = /(google)\s(?:2020)/;
var str = "google 2020"

返回的數(shù)組[google 2020,google]

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

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

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

AI