js中正規表示式的貪婪模式和非貪婪模式

2021-07-12 05:51:18 字數 2261 閱讀 6263

在講貪婪模式和惰性模式之前,先回顧一下js正則基礎:

寫法基礎:

①不需要雙引號,直接用//包含 => /wehfwue123123/.test();

②反斜槓\表示轉義 =>/\.jpg$/

③用法基礎:.test(str);

語法:

①錨點類

/^a/=>以"a"開頭

/\.jpg$/=>以".jpg"結尾

②字元類

[abc]:a或b或c

[0-9]:乙個數字

[a-z]:乙個字母

.       :任意字元

③元字元

^:在裡面用表示非,在外面用表示開頭

\d:[0-9]

\s:空白符

\w:[a-za-z0-9_]

\d:[^\d]-非數字

\s:非空白符

④量詞

:m到n次

元字元表示:

*:?:

+:難點:貪婪模式/惰性模式

貪婪模式——在匹配成功的前提下,盡可能多的去匹配

惰性模式——在匹配成功的前提下,盡可能少的去匹配

解釋一:碼文並茂

使用正規表示式中的貪婪、惰性的量詞可以控制表示式匹配過程,我們知道量詞?、*、+的意義,可以指定相關模式出現的次數,預設的情況下我們使用的是貪婪量詞,它的匹配過程是從整個字串開始檢視,如果不匹配就去掉最後乙個,再看看是否匹配,如此迴圈一直到匹配或字串空為止,如:

vars ="abbbaabbbaaabbb1234";

varre1=/.*bbb/g;//*是貪婪量詞

re1.test(s);

這個匹配過程將從整個字串開始:

re1.test("abbbaabbbaaabbb1234");//false  ,則去掉最後乙個字元4再繼續

re1.test("abbbaabbbaaabbb123");//false  ,則去掉最後乙個字元3再繼續

re1.test("abbbaabbbaaabbb12");//false  ,則去掉最後乙個字元2再繼續

re1.test("abbbaabbbaaabbb1");//false  ,則去掉最後乙個字元1再繼續

re1.test("abbbaabbbaaabbb");//true ,結束

在貪婪量詞的後面加多乙個?就變成了惰性量詞,它的匹配過程相反,是從前面第乙個開始,不匹配則加乙個,如此迴圈直到字串結束,以上面的為例子。

vars ="abbbaabbbaaabbb1234";

varre1=/.*?bbb/g;//*?是惰性量詞

注意:?是加在bbb前面的,即緊跟對應的量詞後面

re1.test(s);

它的匹配過程如下:

re1.test("a");//false,  再加乙個

re1.test("ab");//false,  再加乙個

re1.test("abb");//false,  再加乙個

re1.test("abbb");//true,  匹配了,儲存這個結果,再從下乙個開始

re1.test("a");//false,  再加乙個

re1.test("aa");//false,  再加乙個

re1.test("aab");//false,  再加乙個

re1.test("aabb");//false,  再加乙個

re1.test("aabbb");//true,  匹配了,儲存這個結果,再從下乙個開始

三.解釋二:直戳原理

貪婪與惰性模式區別如下:

一、從語法角度看

貪婪模式用於匹配優先量詞修飾的子表示式,匹配優先量詞包括:「」、「」、「?」、「*」和「+」。

惰性模式用於匹配忽略優先量詞修飾子表示式,匹配忽略優先量詞包括:「?」、「?」、「??」、「*?」和「+?」。

二、從應用角度看

兩者均影響被量詞修飾的子表示式匹配行為,貪婪模式在匹配成功的前提下盡可能多地匹配,而惰性模式則在匹配成功的前提下盡可能少匹配。惰性模式只被部分nfa引擎支援。

三、從匹配原理看

能達到同樣匹配結果的情況下,通常貪婪模式效率較高。

惰性模式都可通過修改量詞修飾的子表示式轉換為貪婪模式。

貪婪模式可以與固化分組結合,提公升匹配效率,而惰性模式不行。

正規表示式貪婪和非貪婪模式

限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上乙個?就可以實現非貪婪或最小匹配。文字 貪婪 下面的表示式匹配從開始小於符號 之間的所有內容。非貪婪 如果您只需要匹配開始和結束 h1 標籤,下面的非貪婪表示式只匹配 如果只想匹配開始的 h1 標籤,表示式則是 可以在grep中使用...

正規表示式 貪婪模式和非貪婪模式

在正規表示式中,存在兩種匹配模式。貪婪模式 正規表示式,在符合條件前提下,會盡可能多的匹配結果 懶惰模式 在正規表示式,如果符合條件的前提下,會盡可能少的匹配。在python中正規表示式預設是貪婪模式 個別語言也可能是非貪婪模式 貪婪模式就是總會嘗試匹配到更多的字元。非貪婪模式則反之,總是嘗試匹配盡...

正規表示式 貪婪非貪婪模式

貪婪與非貪婪模式影響的是被量詞修飾的子表示式的匹配行為,貪婪模式在整個表示式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表示式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分nfa引擎所支援。1.舉乙個例子 string str abcaxc patter p ab.c 貪婪匹配 正規表...