麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Regex > 正文

正則表達(dá)式教程之重復(fù)匹配詳解

2020-03-16 20:55:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了正則表達(dá)式教程之重復(fù)匹配。分享給大家供大家參考,具體如下:

注:在所有例子中正則表達(dá)式匹配結(jié)果包含在源文本中的之間,有的例子會(huì)使用Java來(lái)實(shí)現(xiàn),如果是java本身正則表達(dá)式的用法,會(huì)在相應(yīng)的地方說明。所有java例子都在JDK1.6.0_13下測(cè)試通過。

一、有多少個(gè)匹配

前面幾篇講的都是匹配一個(gè)字符,但是一個(gè)字符或字符集合要匹配多次,應(yīng)該怎么做呢?比如要匹配一個(gè)電子郵件地址,用之前說到的方法,可能有人會(huì)寫出像/w@/w/./w這樣的正則表達(dá)式,但這個(gè)只能匹配到像[email protected]這樣的地址,明顯是不正確的,接下來(lái)就來(lái)看看如何匹配電子郵件地址。

首先要知道電子郵件地址的組成:以字母數(shù)字或下劃線開頭的一組字符,后面跟@符號(hào),再后面是域名,即用戶名@域名地址。不過這也跟具體的郵箱服務(wù)提供商有關(guān),有的在用戶名中也允許.字符。

1、匹配一個(gè)或多個(gè)字符

要想匹配同一個(gè)字符(或字符集合)的多次重復(fù),只要簡(jiǎn)單地給這個(gè)字符(或字符集合)加上一個(gè)+字符作為后綴就可以了。+匹配一個(gè)或多個(gè)字符(至少一個(gè))。如:a匹配a本身,a+將匹配一個(gè)或多個(gè)連續(xù)出現(xiàn)的a;[0-9]+匹配多個(gè)連續(xù)的數(shù)字。

注意:在給一個(gè)字符集合加上+后綴的時(shí)候,必須把+放在字符集合的外面,否則就不是重復(fù)匹配了。如[0-9+]這樣就表示數(shù)字或+號(hào)了,雖然語(yǔ)法上正確,但不是我們想要的了。

文本:Hello, [email protected] or [email protected] is my email.

正則表達(dá)式:/w+@(/w+/.)+/w+

結(jié)果:Hello, [email protected] or [email protected] is my email.

分析:/w+可以匹配一個(gè)或多個(gè)字符,而子表達(dá)式(/w+/.)+可匹配像xxxx.edu.這樣的字符串,而最后不會(huì)是.字符結(jié)尾,所以后面還會(huì)有一個(gè)/w+。像[email protected]這樣的郵件地址也會(huì)匹配到。

2、匹配零個(gè)或多個(gè)字符

匹配零個(gè)或多個(gè)字符使用元符*,它的用法和+完全一樣,只要把它放在一下字符或字符集合的后面,就可以匹配該字符(或字符集合)連續(xù)出現(xiàn)零次或多次。如正則表達(dá)式ab*c可以匹配ac、abc、abbbbbc等。

3、匹配零個(gè)或一個(gè)字符

匹配零個(gè)或一個(gè)字符使用元字符?。像上一篇說到的匹配一個(gè)空白行使用正則表達(dá)式/r/n/r/n,但在Unix和Linux中不需要/r,就可以使用元字符?,/r?/n/r?/n這樣既可匹配windows中的空白行,也可匹配Unix和Linux中的空白行。下面來(lái)看一個(gè)匹配http或https協(xié)議的URL的例子:

文本:The URL is http://www.mikan.com, to connect securely use https://www.mikan.cominstead.

正則表達(dá)式:https?://(/w+/.)+/w+

結(jié)果:The URL is 【http://www.mikan.com】, to connect securely use 【https://www.mikan.com】 instead.

分析:這個(gè)模式以https?開頭,表示?之前的一個(gè)字符可以有,也可以沒有,所以它能匹配http或https,后面部分和前一個(gè)例子一樣。

二、匹配的重復(fù)次數(shù)

正則表達(dá)式里的+、*和?解決了很多問題,但是:

1)+和*匹配的字符個(gè)數(shù)沒有上限。我們無(wú)法為它們將匹配的字符個(gè)數(shù)設(shè)定一個(gè)最大值。

2)+、*和?至少匹配一個(gè)或零個(gè)字符。我們無(wú)法為它們將匹配的字符個(gè)數(shù)另行設(shè)定一個(gè)最小值。

3)如果只使用*和+,我們無(wú)法把它們將匹配的字符個(gè)數(shù)設(shè)定為一個(gè)精確的數(shù)字。

正則表達(dá)式里提供了一個(gè)用來(lái)設(shè)定重復(fù)次數(shù)的語(yǔ)法,重復(fù)次數(shù)要用{和}字符來(lái)給出,把數(shù)值寫在它們中間。

1、為重復(fù)匹配次數(shù)設(shè)定一個(gè)精確值

如果想為重復(fù)匹配次數(shù)設(shè)定一個(gè)精確的值,把那個(gè)數(shù)字寫在{和}之間即可。如{4}表示它前面的那個(gè)字符(或字符集合)必須在原始文本中連續(xù)重復(fù)出現(xiàn)4次才算是一個(gè)匹配,如果只出現(xiàn)了3次,也不算是一個(gè)匹配。

如前面幾篇中說到的匹配頁(yè)面中顏色的例子,就可以用重復(fù)次數(shù)來(lái)匹配:#[[:xdigit:]]{6}或#[0-9a-fA-F]{6},POSIX字符在java中是#//p{XDigit}{6}。

2、為重復(fù)匹配次數(shù)設(shè)定一個(gè)區(qū)間

{}語(yǔ)法還可以用來(lái)為重復(fù)匹配次數(shù)設(shè)定一個(gè)區(qū)間,也就是為重復(fù)匹配次數(shù)設(shè)定一個(gè)最小值和最大值。這種區(qū)間必須以{n, m}這樣的形式給出,其中n>=m>=0。如檢查日期格式是否正確(不檢查日期的有效性)的正則表達(dá)式(如日期2012-08-12或2012-8-12):/d{4}-/d{1,2}-/d{1,2}。

3、匹配至少重復(fù)多少次

{}語(yǔ)法的最后一種用法是給出一個(gè)最小的重復(fù)次數(shù)(但不必給出最大重復(fù)次數(shù)),如{3,}表示至少重復(fù)3次。注意:{3,}中一定要有逗號(hào),而且逗號(hào)后不能有空格。否則會(huì)出錯(cuò)。

來(lái)看一個(gè)例子,使用正則表達(dá)式把所有金額大于$100的金額找出來(lái):

文本:

$25.36

$125.36

$205.0

$2500.44

$44.30

正則表達(dá)式:$/d{3,}/./d{2}

結(jié)果:

$25.36

【$125.36】

【$205.0】

【$2500.44】

$44.30

+、*、?可以表示成重復(fù)次數(shù):

+等價(jià)于{1,}

*等價(jià)于{0,}

?等價(jià)于{0,1}

三、防止過度匹配

?只能匹配零個(gè)或一個(gè)字符,{n}和{n,m}也有匹配重復(fù)次數(shù)的上限,但是像*、+、{n,}都沒有上限值,這樣有時(shí)會(huì)導(dǎo)致過度匹配的現(xiàn)象。

來(lái)看匹配一個(gè)html標(biāo)簽的例子

文本:

Yesterday is <b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>.

正則表達(dá)式:<[Bb]>.*</[Bb]>

結(jié)果:

Yesterday is 【<b>history</b>,tomorrow is a <B>mystery</B>, but today is a <b>gift</b>】.

分析:<[Bb]>匹配<b>標(biāo)簽(不區(qū)分大小寫),</[Bb]>匹配</b>標(biāo)簽(不區(qū)分大小寫)。但結(jié)果卻不是預(yù)期的那樣有三個(gè),第一個(gè)</b>標(biāo)簽之后,一直到最后一個(gè)</b>之間的東西全部匹配出來(lái)了。

為什么會(huì)這樣呢?因?yàn)?和+都是貪婪型的元字符,它們?cè)谄ヅ鋾r(shí)的行為模式是多多益善,它們會(huì)盡可能從一段文本的開頭一直匹配到這段文本的末尾,而不是從這段文本的開頭匹配到碰到第一個(gè)匹配時(shí)為止。

當(dāng)不需要這種貪婪行為時(shí),可以使用這些元字符的懶惰型版本。懶惰意思是匹配盡可能少的字符,與貪婪型相反。懶惰型元字符只需要給貪婪型元字符加上一個(gè)?后綴即可。下面是貪婪型元字符的對(duì)應(yīng)懶惰型版本:

*       *?

+       +?

{n,}   {n,}?

所以上面的例子中,正則表達(dá)式只需要改成<[Bb]>.*?</[Bb]>即可,結(jié)果如下:

<b>history</b>

<B>mystery</B>

<b>gift</b>

四、總結(jié)

正則表達(dá)式的真下威力體現(xiàn)在重復(fù)次數(shù)匹配方面。這里介紹了+、*、?幾種元字符的用法,如果要精確的確定匹配次數(shù),使用{}。元字符分貪婪型和懶惰型兩種,在需要防止過度匹配的場(chǎng)合下,請(qǐng)使用懶惰型元字符來(lái)構(gòu)造正則表達(dá)式。在下一篇中將會(huì)介紹位置匹配。

希望本文所述對(duì)大家正則表達(dá)式學(xué)習(xí)有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到正則表達(dá)式頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩2区 | 夜夜夜精品视频 | 亚洲成人免费网站 | 美女黄网站免费观看 | 日本一区免费看 | 国产99久久久国产精品下药 | 国产一精品久久99无吗一高潮 | 免费欧美精品 | 国产三级精品最新在线 | 久久久在线 | 亚洲男人一区 | 一区二区三区小视频 | www久久综合 | 精品国产一区二区三区久久久蜜月 | 欧美视频在线一区二区三区 | 性视频久久 | 国产精品午夜未成人免费观看 | 成人短视频在线播放 | 麻豆视频网 | 国产一级毛片高清视频 | 久久久久久久.comav | 国产中出在线观看 | 国产99久久精品 | 麻豆视频观看 | 青草伊人网 | 黄色成人小视频 | 国产91亚洲精品一区二区三区 | 欧美久久久久久久久 | 依依成人精品视频 | 欧美18一12sex性处hd | 亚洲成人福利网站 | 久久久成人精品视频 | 成年免费视频黄网站在线观看 | 成年免费看 | 久久噜噜噜精品国产亚洲综合 | 国产成人精品区 | 日韩美香港a一级毛片 | 久久综合久久综合久久综合 | 欧美日韩一区,二区,三区,久久精品 | 免费黄色大片在线观看 | 特级a欧美做爰片毛片 |