正則表達式學習筆記(三)——重復匹配


1.有多少個匹配

\w@\w\.\w  只能匹配a@b.c 形式,由於\w 只能匹配單個字符

1.1 匹配一個或多個字符

使用+做為后綴,+ 匹配一個或多個字符,至少1個,不匹配0個

例如匹配電子郵箱格式為  text@text.text

文本 Hello,MyEmail is abcd@gmail..com ,xiaoming’sEmail is asdw.gmail.magic.com

正則表達式  \w+@\w+\.\w+

結果

hello,my email is abcd@gmail.com, ,xiaoming’s Email is .sdw.gmail.magic.com

分析:\w可以匹配所有的字母和數字(以及下划線_。這個字符在電子郵件中是合法的),第一個\w+匹配多個字母或數字字符,然后接一個@(@不需要轉義),第二個\w+匹配多個字母或數字字符,\.匹配一個.(.需要轉義,這里才用的\.)第三個\w+匹配多個字母或數字字符.

 

但是這里我們漏掉了asdw.gmail.magic.com,加入要這兩個都匹配出來,可以使用[\w.]+@[\w.]+\.\w+

 

1.1 匹配零個或多個字符

使用*即可。和+類似,但是+至少匹配一次,*可以一次也不匹配。

1.2  匹配0個或一個字符

使用元字符? 

1.3匹配重復次數

 正則表達式的+、*、?解決了很多問題,但是有時候,我們需要精確到某一個次數,正則表達式提供了一個設置次數的語法。

1.3.1 匹配重復次數

{num}匹配num次,例如

文本 1231234 12345 abcde abcedf

正則表達式:\w{5}

結果:123 1234 12345 abcde abce5f

1.3.2為重復匹配設定一個區間

{num1,num2}匹配num1次到num2次之間,例如

文本:aa11aa,aa1aa,bb111bb,bb1111aa

正則表達式:[0-9]{2,4}

結果:aa11aa,aa1aa,bb111bb,bb1111aa

1.3.3 匹配至少重復多少次

{num,}例如:

文本:  123 1234 12345 abcde,abcedfabcdefghijk

正則表達式: \w{4,}

結果: 123 1234 12345 abcde abcedf,abcedfabcdefghijk

1.3.4 防止過度匹配

 

?只能匹配一個字符,{n}和{m,n}也有一個重復次數的上限但是對於其他的,例如+、*等沒有一個上限,有時候就會導致過渡匹配的情況,例如下面這個例子

文本: Learn English is important,but in <b>CH</b>AND<b>JP<b>,the teachingis not available.

正則表達式:<[Bb]>.* </[Bb]>

結果: Learn English is important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

分析:顯然,這個.*把第第二個</b>和第三個<b>都給一網打盡,雖然沒有漏掉我們所需要的文本,但是,這兩個b卻莫名失蹤了,還多匹配了一個and

      為什么會這樣呢,是因為*和+都是“貪婪型”元字符,他們在進行匹配時是多多益善的而不是適可而止的。

     解決辦法:使用這些元字符的“懶惰型”版本,使其匹配盡可能的少。

 

常見的貪婪型元字符和他們的懶惰型版本

貪婪型元字符

懶惰型元字符

*

*?

+

+?

{n,}

{n,}?

 

 

正則表達式:<[Bb]>.*?</[Bb]>

結果:LearnEnglish is  important,but in <b>CH</b>AND<b>JP<b>,theteaching is not available.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM