欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

正則表達式量詞與貪婪的使用詳解

 更新時間:2021年07月26日 09:48:56   作者:容華謝后  
今天我們一起來學(xué)習(xí)下正則中量詞的三種匹配模式,貪婪模式、非貪婪模式、獨占模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

0.寫在前面

上一篇文章中,我們學(xué)習(xí)了正則的一些基礎(chǔ)元字符,相信大家都已經(jīng)忘卻的差不多了,可以點擊上面的鏈接再溫習(xí)下。

今天我們一起來學(xué)習(xí)下正則中量詞的三種匹配模式,貪婪模式、非貪婪模式、獨占模式,這些模式會改變正則中量詞的匹配行為,是每次貪婪的匹配到更多呢,還是不貪婪見好就收呢,如果不了解這些,我們寫出的正則很可能是錯誤的,甚至?xí)l(fā)嚴重的線上性能問題。

1.量詞

本篇文章所講的內(nèi)容和量詞關(guān)系比較密切,先回顧下:

量詞

我們還可以用 {m,n} 的方式來表示 * + ? 這3種元字符:

元字符 同義表示方法 示例
* {0,} ab*
可以匹配
a 或者 abb
+ {1,} ab+
可以匹配
ab 或者 abb
但不能匹配 a
? {0,1} ab?
可以匹配 a 或者 ab
但不能匹配 abb

2.貪婪模式前傳

在正則中,表示次數(shù)的量詞默認是貪婪的,在貪婪模式下,會盡可能最大長度的去匹配目標字符串,我們用正則 a+a* 來匹配字符串 aaabb 測試一下。

2.1 使用 a+ 進行匹配

可以看到只匹配到了1個結(jié)果 aaa

a+匹配

對應(yīng)的 Python 代碼如下:

import re

print(re.findall(r'a+', 'aaabb'))

輸出:['aaa']

2.2 使用 a* 進行匹配

可以看到匹配到了4個結(jié)果,其中還有3個是空字符串

a*匹配.jpg

對應(yīng)的 Python 代碼如下:

import re

print(re.findall(r'a*', 'aaabb'))

輸出:['aaa', '', '', '']

為什么會匹配到空字符串呢?因為星號(*)代表匹配0到多次,匹配0次就是空字符串,那前面還有個 aaa 呢,為什么 aaa 之間的空字符串沒有被匹配到?

這就引入到了我們今天要講的,貪婪模式與非貪婪模式,從字面上很好理解,貪婪模式就是盡可能多的匹配,非貪婪模式就是盡可能少的匹配。

3.貪婪模式

一起來分析下上面正則 a* 的匹配過程:

字符串 a a a b b 空字符串
下標 0 1 2 3 4 5

匹配 開始 結(jié)束 說明 匹配內(nèi)容
第一次 0 3 到第一個字母b發(fā)現(xiàn)不匹配,輸出aaa aaa
第二次 3 3 匹配剩下的bb,發(fā)現(xiàn)匹配不上,輸出空字符串 空字符串
第三次 4 4 匹配剩下的b,發(fā)現(xiàn)匹配不上,輸出空字符串 空字符串
第四次 5 5 匹配剩下的空字符串,輸出空字符串 空字符串

a* 在匹配字符串 aaabb 時,會盡可能多的把前面的 a 都匹配上,直到第一個字母 b 不滿足要求為止,匹配上3個 a,后面每次匹配的都是空字符串。

看到這里,相信你已經(jīng)對貪婪模式有了更深的印象,貪婪模式的特點就是盡可能進行最大長度匹配,就是有多少要多少,下面我們在一起來看下與它完全相反的匹配模式。

4.非貪婪模式

上面講完了貪婪模式,貪婪模式是盡可能最大長度匹配,非貪婪模式就是盡可能最小長度匹配,在量詞的后面加一個問號(?),就成了非貪婪模式,比如 a*?

非貪婪匹配

對應(yīng)的 Python 代碼如下:

import re

// 貪婪匹配
print(re.findall(r'a*', 'aaabb'))

輸出:['aaa', '', '', '']

// 非貪婪匹配
print(re.findall(r'a*?', 'aaabb'))

輸出:['', 'a', '', 'a', '', 'a', '', '', '']

學(xué)完了貪婪模式與非貪婪模式,你可能會問,我什么情況下會用到呢,下面舉個栗子感受下:

貪婪匹配例子

非貪婪匹配例子

需求是查找一段字符串中,所有雙引號括起來的內(nèi)容,上面使用貪婪匹配與非貪婪匹配的對比,差別很明顯對吧。

5.獨占模式

不管是貪婪模式,還是非貪婪模式,匹配過程中都需要發(fā)生回溯才能完成想要的功能,但是在有一些場景,我們不需要回溯,匹配不上直接返回失敗就可以了,因此正則匹配中還有另外一種模式,獨占模式,它和貪婪模式很像,但匹配過程中不會發(fā)生回溯,在一些使用場景中性能會更好。

先來講講什么是回溯,再舉個栗子,有一個正則表達式和目標字符串,我們分別看下在三種匹配模式下都發(fā)生了什么:

5.1 貪婪匹配過程

正則表達式:ab{1,3}c

目標字符串:abbc

在匹配時,b{1,3} 會盡可能長的去匹配目標字符串,匹配完 abb 之后,因為要盡可能長的匹配(3個 b),目標字符串中的c就會匹配不上,這個時候會發(fā)生向前回溯,吐出當前字符 c,用正則中的 c 去匹配,匹配成功。

貪婪匹配過程

import regex

print(regex.findall(r'ab{1,3}c', 'abbc'))

輸出:['abbc']

5.2 非貪婪匹配過程

正則表達式:ab{1,3}?c

目標字符串:abbc

在匹配時,b{1,3} 會盡可能短的去匹配目標字符串,匹配完 ab 之后,會直接用正則 c 去匹配目標字符串剩下的 b,匹配不上,發(fā)生向前回溯,重新用正則 b{1,3} 匹配 目標字符串剩下的 b,然后正則 c 匹配 目標字符串剩下的 c,匹配成功。

非貪婪匹配過程

import regex

print(regex.findall(r'ab{1,3}?c', 'abbc'))

輸出:['abbc']

5.3 獨占匹配過程

在量詞后面加上 + 就是獨占模式。

正則表達式:ab{1,2}+bc

目標字符串:abbc

在匹配時,b{1,2} 會盡可能長的去匹配目標字符串,匹配完 abb 之后,會用正則 b 匹配目標字符串剩下的 c,匹配不上,不回溯,匹配失敗。

獨占匹配過程

import regex

print(regex.findall(r'ab{1,2}+bc', 'abbc'))

輸出:[]

6.寫在最后

最后在總結(jié)下上面講到的內(nèi)容:

思維導(dǎo)圖

到這里,正則表達式的量詞與貪婪就講完了,如果有問題可以給我留言評論,謝謝。

正則表達式在線校驗工具:https://regex101.com/

到此這篇關(guān)于正則表達式量詞與貪婪的使用詳解的文章就介紹到這了,更多相關(guān)正則表達式 量詞與貪婪內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS基礎(chǔ)教程——正則表達式示例(推薦)

    JS基礎(chǔ)教程——正則表達式示例(推薦)

    本文給大家分享js基礎(chǔ)之正則表達式知識,以及在正則表達式中() [] {}所代表的意思,本文給大家介紹的非常詳細,需要的朋友參考下
    2017-01-01
  • Snort中pcre和正則表達式的使用詳解

    Snort中pcre和正則表達式的使用詳解

    這篇文章主要介紹了Snort中pcre和正則表達式的使用,題目要求檢測包含兩個包的特定流,需要通過設(shè)置標記位,即flowbits來實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • 精通 JavaScript中的正則表達式手機整理 推薦

    精通 JavaScript中的正則表達式手機整理 推薦

    精通 JS正則表達式,想學(xué)習(xí)js正則表達式的朋友非常值得看,整理的比較不錯。
    2009-10-10
  • 修改月光博客網(wǎng)站中PHP常用正則表達式中出現(xiàn)的錯誤

    修改月光博客網(wǎng)站中PHP常用正則表達式中出現(xiàn)的錯誤

    這篇文章主要介紹了修改月光博客網(wǎng)站中PHP常用正則表達式中出現(xiàn)的錯誤,需要的朋友可以參考下
    2014-04-04
  • 正則表達式拆分url實例代碼

    正則表達式拆分url實例代碼

    這篇文章主要給大家介紹了關(guān)于正則表達式拆分url的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • 正則表達式對qq號碼校驗

    正則表達式對qq號碼校驗

    這篇文章主要介紹了正則表達式對qq號碼進行校驗的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-06-06
  • 8個你應(yīng)該了解的正則表達式提高你的工作效率

    8個你應(yīng)該了解的正則表達式提高你的工作效率

    正則表達式也可以被當作是一門語言,入門時可能很吃力,不過一旦學(xué)會了就方便很多,在處理一些比較復(fù)雜的替換時,正則表達式就會發(fā)揮它的真正作用,本文整理了一些常用的正則,感興趣的朋友可以了解下,或許對你有所幫助
    2013-01-01
  • mysql update正則替換sql語句

    mysql update正則替換sql語句

    這篇文章主要介紹了mysql update正則替換sql語句的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • 通過正則表達式刪除空行的方法

    通過正則表達式刪除空行的方法

    我們的目標是要刪除文本中的空行,可能一行也可能是多行
    2014-05-05
  • 編寫高質(zhì)量的js之正確理解正則表達式回溯

    編寫高質(zhì)量的js之正確理解正則表達式回溯

    在正則表達式實現(xiàn)中,回溯是匹配過程的基本組成部分,它是正則表達式如此好用和強大的根源。然而,回溯計算代價很高,如果設(shè)計失誤,將導(dǎo)致失控?;厮菔怯绊懻w性能的唯一因素,理解它的工作原理,以及如何減小使用頻率,可能是編寫高效正則表達式的關(guān)鍵點
    2016-12-12

最新評論