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.