Further Study of Rugular Expresions第1/2頁
更新時間:2008年09月24日 22:53:38 作者:
regular expressions(正則表達式,以下用re稱呼)對小弟來說一直都是神密的地帶,看到一些網(wǎng)絡上的大大,簡單用re就決解了 某些文字的問題
小弟便興起了學一學re的想法,但小弟天生就比較懶一些,總希望看有沒有些快速學習的方式,于是小弟又請出google大神,藉由祂的神 力,小弟在網(wǎng)絡上找到了jim hollenhorst先生的文章,經(jīng)過了閱讀,小弟覺得真是不錯,所以就做個小心得報告,跟move-to.net的朋 友分享,希望能為各位大大帶來一丁點在學習re時的幫助。jim hollenhorst大大文章之網(wǎng)址如下,有需要的大大可直接連結。
the 30 minute regex tutorial by jim hollenhorst
http://www.codeproject.com/useritems/regextutorial.asp
什么是re?
想必各位大大在做文件查找的時侯都有使用過萬用字符”*”,比如說想查找在windows目錄下所有的word文件時,你可能就會用”*.doc”這樣的方式來做查找,因為”*”所代表的是任意的字符。re所做的就是類似這樣的功能,但其功能更為強大。
寫程序時,常需要比對字符串是否符合特定樣式,re最主要的功能就是來描述這特定的樣式,因此可以將re視為特定樣式的描述式,舉個例子來說,”\ w +”所代表的就是任何字母與數(shù)字所組成的非空字符串(non-null string)。在.net framework中提供了非常強大的類別庫, 藉此可以很輕易的使用re來做文字的查找與取代、對復雜標頭的譯碼及驗證文字等工作。
學習re最好的方式就是藉由例子親自來做做看。jim hollenhorst大大也提供了一個工具程序expresso(來杯咖啡吧),來幫助我們學習re,下載的網(wǎng)址是http://www.codeproject.com/useritems/regextutorial/expressosetup2_1c.zip。
接下來,就讓我們來體驗一些例子吧。
一些簡單的例子
假設要查找文章中elvis后接有alive的文字符串的話,使用re可能會經(jīng)過下列的過程,括號是所下re的意思:
1. elvis (查找elvis)
上述代表所要查找的字符順序為elvis。在.net中可以設定乎略字符的大小寫,所以”elvis”、”elvis”或者是”elvis”都是符合 1 所下的re。但因為這只管字符出現(xiàn)的順序為elvis,所以pelvis也是符合1所下的re。可以用2的re來改進。
2. \belvis\b (將elvis視為一整體的字查找,如elvis、elvis乎略字符大小寫時)
“\b”在re中有特別的意思,在上述的例子中所指的就是字的邊界,所以\belvis\b用\b把elvis的前后邊界界定出來,也就是要elvis這個字。
假設要將同一行里elvis后接有alive的文字符串找出來,此時就會用到另外二個特別意義的字符”.”及”*”?!?”所代表就是除了換行字符的 任意字符,而”*”所代表的是重復*之前項目直到找到符合re的字符串。所以”.*”所指的就是除了換行字符外的任意數(shù)目的字符數(shù)。所以查找同一行里 elvis后接有alive的文字符串找出來,則可下如3之re。
3. \belvis\b.*\balive\b (查找elvis后面接有alive的文字符串,如elvis is alive)
用簡單之特別字符就可以組成功能強大的re,但也發(fā)現(xiàn)當使用越來越多的特別字符時,re就會越來越難看得懂了。
再看看另外的例子
組成有效的電話號碼
假使要從網(wǎng)頁上收集顧客格式為xxx-xxxx的7位數(shù)字的電話號碼,其中x是數(shù)字,re可能會這樣寫。
4. \b\d\d\d-\d\d\d\d (查找七位數(shù)字之電話號碼,如123-1234)
每一個\d代表一個數(shù)字?!?”則是一般的連字符號,為避免太多重復的\d,re可以改寫成如5的方式。
5. \b\d{3}-\d{4} (查找七位數(shù)字電話號碼較好的方法,如123-1234)
在\d后的{3},代表重復前一個項目三次,也就是相等于\d\d\d。
re的學習及測試工具 expresso
因為re不易閱讀及使用者容易會下錯re的特性,jim大大開發(fā)了一個工具軟件expresso,用來幫助使用者學習及測試re,除了上面所述的網(wǎng)址之外,也可以上ultrapico網(wǎng)站(http://www.ultrapico.com)。安裝完expresso后,在expression library中,jim大大把文章的例子都建立在其中,可以邊看文章邊測試,也可以試著修改范例所下的re,馬上可以看到結果,小弟覺得非常好用。各位大大可以試試。
.net中re的基礎概念
特殊字符
有些字符有特別的意義,比如之前所看到的”\b”、”.”、”*”、”\d”等。”\s”所代表的是任意空格符,比如說spaces、tabs、newlines等.?!盶w”代表是任意字母或數(shù)字字符。
再看一些例子吧
6. \ba\w*\b (查找a開頭的字,如able)
這re描述要查找一個字的開始邊界(\b),再來是字母”a”,再加任意數(shù)目的字母數(shù)字(\w*),再接結束這個字的結束邊界(\b)。
7. \d+ (查找數(shù)字字符串)
“+”和”*”非常相似,除了+至少要重復前面的項目一次。也就是說至少有一個數(shù)字。
8. \b\w{6}\b (查找六個字母數(shù)字的字,如ab123c)
下表為re常用的特殊字符
. 除了換行字符的任意字符
\w 任意字母數(shù)字字符
\s 任意空格符
\d 任意數(shù)字字符
\b 界定字的邊界
^ 文章的開頭,如”^the'' 用以表示出現(xiàn)于文章開頭的字符串為”the”
$ 文章的結尾,如”end$”用以表示出現(xiàn)在文章的結尾為”end”
特殊字符”^”及”$”是用來查找某些字必需是文章的開頭或結尾,這在驗證輸入是否符合某一樣式時特別用有,比如說要驗證七位數(shù)字的電話號碼,可能會輸入如下9的re。
9. ^\d{3}-\d{4}$ (驗證七位數(shù)字之電話號碼)
這和第5個re相同,但其前后都無其它的字符,也就是整串字符串只有這七個數(shù)字的電話號碼。在.net中如果設定multiline這個選項,則”^”和”$”會每行進行比較,只要某行的開頭結尾符合re即可,而不是整個文章字符串做一次比較。
轉意字符(escaped characters)
有時可能會需要”^”、”$”單純的字面意義(literal meaning)而不要將它們當成特殊字符,此時”\”字符就是用來移除特殊字符特別意義的字符,因此”\^”、”\.”、”\\”所代表的就是”^”、”.”、”\”的字面意義。
重復前述項目
在前面看過”{3}”及”*”可以用來重復前述字符,之后我們會看到如何用同樣的語法重復整個次描述(subexpressions)。下表是使用重復前述項目的一些方式。
* 重復任意次數(shù)
+ 重復至少一次
? 重復零次或一次
{n} 重復n次
{n,m} 重復至少n次,但不超過m次
{n,} 重復至少n次
再來試一些例子吧
10. \b\w{5,6}\b (查找五個或六個字母數(shù)字字符的字,如as25d、d58sdf等)
11. \b\d{3}\s\d{3}-\d{4} (查找十個數(shù)字的電話號碼,如800 123-1234)
12. \d{3}-\d{2}-\d{4} (查找社會保險號碼,如 123-45-6789)
13. ^\w* (每行或整篇文章的第一個字)
在espresso可試試有multiline和沒multiline的不同。
匹配某范圍的字符
有時需要查找某些特定的字符時怎么辨?這時中括號”[]”就派上了用場。因此[aeiou]所要查找的是”a”、”e”、”i”、”o”、”u”這些 元音,[.?!]所要查找的是”.”、”?”、”!”這些符號,在中括號中的特殊字符的特別意義都會被移除,也就是解譯成單純的字面意義。也可以指定某些 范圍的字符,如”[a-z0-9]”,所指的就是任意小寫字母或任意數(shù)字。
接下來再看一個比較初復雜查找電話號碼的re例子
14. \(?\d{3}[( ] \s?\d{3}[- ]\d{4} (查找十位數(shù)字之電話號碼,如(080) 333-1234 )
這樣的re可查找出較多種格式的電話號碼,如(080) 123-4567、511 254 6654等?!盶(?”代表一個或零個左小括號”(“, 而”[( ]”代表查找一個右小括號”)”或空格符,”\s?”指一個或零個空格符組。但這樣的re會將類似”800) 45-3321”這樣的電話找出 來,也就是括號沒有對稱平衡的問題,之后會學到擇一(alternatives)來決解這樣的問題。
不包含在某特定字符組里(negation)
有時需要查找在包含在某特定字符組里的字符,下表說明如何做類似這樣的描述。
\w 不是字母數(shù)字的任意字符
\s 不是空格符的任意字符
\d 不是數(shù)字字符的任意字符
\b 不在字邊界的位置
[^x] 不是x的任意字符
[^aeiou] 不是a、e、i、o、u的任意字符
15. \s+ (不包含空格符的字符串)
擇一(alternatives)
有時會需要查找?guī)讉€特定的選擇,此時””這個特殊字符就派上用場了,舉例來說,要查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼。
16. \b\d{5}-\d{4}\b\b\d{5}\b (查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼)
在使用alternatives時需要注意的是前后的次序,因為re在alternatives中會優(yōu)先選擇符合最左邊的項目,16中,如果把查找五個數(shù)字的項目放在前面,則這re只會找到五個數(shù)字的郵政編碼。了解了擇一,可將14做更好的修正。
the 30 minute regex tutorial by jim hollenhorst
http://www.codeproject.com/useritems/regextutorial.asp
什么是re?
想必各位大大在做文件查找的時侯都有使用過萬用字符”*”,比如說想查找在windows目錄下所有的word文件時,你可能就會用”*.doc”這樣的方式來做查找,因為”*”所代表的是任意的字符。re所做的就是類似這樣的功能,但其功能更為強大。
寫程序時,常需要比對字符串是否符合特定樣式,re最主要的功能就是來描述這特定的樣式,因此可以將re視為特定樣式的描述式,舉個例子來說,”\ w +”所代表的就是任何字母與數(shù)字所組成的非空字符串(non-null string)。在.net framework中提供了非常強大的類別庫, 藉此可以很輕易的使用re來做文字的查找與取代、對復雜標頭的譯碼及驗證文字等工作。
學習re最好的方式就是藉由例子親自來做做看。jim hollenhorst大大也提供了一個工具程序expresso(來杯咖啡吧),來幫助我們學習re,下載的網(wǎng)址是http://www.codeproject.com/useritems/regextutorial/expressosetup2_1c.zip。
接下來,就讓我們來體驗一些例子吧。
一些簡單的例子
假設要查找文章中elvis后接有alive的文字符串的話,使用re可能會經(jīng)過下列的過程,括號是所下re的意思:
1. elvis (查找elvis)
上述代表所要查找的字符順序為elvis。在.net中可以設定乎略字符的大小寫,所以”elvis”、”elvis”或者是”elvis”都是符合 1 所下的re。但因為這只管字符出現(xiàn)的順序為elvis,所以pelvis也是符合1所下的re。可以用2的re來改進。
2. \belvis\b (將elvis視為一整體的字查找,如elvis、elvis乎略字符大小寫時)
“\b”在re中有特別的意思,在上述的例子中所指的就是字的邊界,所以\belvis\b用\b把elvis的前后邊界界定出來,也就是要elvis這個字。
假設要將同一行里elvis后接有alive的文字符串找出來,此時就會用到另外二個特別意義的字符”.”及”*”?!?”所代表就是除了換行字符的 任意字符,而”*”所代表的是重復*之前項目直到找到符合re的字符串。所以”.*”所指的就是除了換行字符外的任意數(shù)目的字符數(shù)。所以查找同一行里 elvis后接有alive的文字符串找出來,則可下如3之re。
3. \belvis\b.*\balive\b (查找elvis后面接有alive的文字符串,如elvis is alive)
用簡單之特別字符就可以組成功能強大的re,但也發(fā)現(xiàn)當使用越來越多的特別字符時,re就會越來越難看得懂了。
再看看另外的例子
組成有效的電話號碼
假使要從網(wǎng)頁上收集顧客格式為xxx-xxxx的7位數(shù)字的電話號碼,其中x是數(shù)字,re可能會這樣寫。
4. \b\d\d\d-\d\d\d\d (查找七位數(shù)字之電話號碼,如123-1234)
每一個\d代表一個數(shù)字?!?”則是一般的連字符號,為避免太多重復的\d,re可以改寫成如5的方式。
5. \b\d{3}-\d{4} (查找七位數(shù)字電話號碼較好的方法,如123-1234)
在\d后的{3},代表重復前一個項目三次,也就是相等于\d\d\d。
re的學習及測試工具 expresso
因為re不易閱讀及使用者容易會下錯re的特性,jim大大開發(fā)了一個工具軟件expresso,用來幫助使用者學習及測試re,除了上面所述的網(wǎng)址之外,也可以上ultrapico網(wǎng)站(http://www.ultrapico.com)。安裝完expresso后,在expression library中,jim大大把文章的例子都建立在其中,可以邊看文章邊測試,也可以試著修改范例所下的re,馬上可以看到結果,小弟覺得非常好用。各位大大可以試試。
.net中re的基礎概念
特殊字符
有些字符有特別的意義,比如之前所看到的”\b”、”.”、”*”、”\d”等。”\s”所代表的是任意空格符,比如說spaces、tabs、newlines等.?!盶w”代表是任意字母或數(shù)字字符。
再看一些例子吧
6. \ba\w*\b (查找a開頭的字,如able)
這re描述要查找一個字的開始邊界(\b),再來是字母”a”,再加任意數(shù)目的字母數(shù)字(\w*),再接結束這個字的結束邊界(\b)。
7. \d+ (查找數(shù)字字符串)
“+”和”*”非常相似,除了+至少要重復前面的項目一次。也就是說至少有一個數(shù)字。
8. \b\w{6}\b (查找六個字母數(shù)字的字,如ab123c)
下表為re常用的特殊字符
. 除了換行字符的任意字符
\w 任意字母數(shù)字字符
\s 任意空格符
\d 任意數(shù)字字符
\b 界定字的邊界
^ 文章的開頭,如”^the'' 用以表示出現(xiàn)于文章開頭的字符串為”the”
$ 文章的結尾,如”end$”用以表示出現(xiàn)在文章的結尾為”end”
特殊字符”^”及”$”是用來查找某些字必需是文章的開頭或結尾,這在驗證輸入是否符合某一樣式時特別用有,比如說要驗證七位數(shù)字的電話號碼,可能會輸入如下9的re。
9. ^\d{3}-\d{4}$ (驗證七位數(shù)字之電話號碼)
這和第5個re相同,但其前后都無其它的字符,也就是整串字符串只有這七個數(shù)字的電話號碼。在.net中如果設定multiline這個選項,則”^”和”$”會每行進行比較,只要某行的開頭結尾符合re即可,而不是整個文章字符串做一次比較。
轉意字符(escaped characters)
有時可能會需要”^”、”$”單純的字面意義(literal meaning)而不要將它們當成特殊字符,此時”\”字符就是用來移除特殊字符特別意義的字符,因此”\^”、”\.”、”\\”所代表的就是”^”、”.”、”\”的字面意義。
重復前述項目
在前面看過”{3}”及”*”可以用來重復前述字符,之后我們會看到如何用同樣的語法重復整個次描述(subexpressions)。下表是使用重復前述項目的一些方式。
* 重復任意次數(shù)
+ 重復至少一次
? 重復零次或一次
{n} 重復n次
{n,m} 重復至少n次,但不超過m次
{n,} 重復至少n次
再來試一些例子吧
10. \b\w{5,6}\b (查找五個或六個字母數(shù)字字符的字,如as25d、d58sdf等)
11. \b\d{3}\s\d{3}-\d{4} (查找十個數(shù)字的電話號碼,如800 123-1234)
12. \d{3}-\d{2}-\d{4} (查找社會保險號碼,如 123-45-6789)
13. ^\w* (每行或整篇文章的第一個字)
在espresso可試試有multiline和沒multiline的不同。
匹配某范圍的字符
有時需要查找某些特定的字符時怎么辨?這時中括號”[]”就派上了用場。因此[aeiou]所要查找的是”a”、”e”、”i”、”o”、”u”這些 元音,[.?!]所要查找的是”.”、”?”、”!”這些符號,在中括號中的特殊字符的特別意義都會被移除,也就是解譯成單純的字面意義。也可以指定某些 范圍的字符,如”[a-z0-9]”,所指的就是任意小寫字母或任意數(shù)字。
接下來再看一個比較初復雜查找電話號碼的re例子
14. \(?\d{3}[( ] \s?\d{3}[- ]\d{4} (查找十位數(shù)字之電話號碼,如(080) 333-1234 )
這樣的re可查找出較多種格式的電話號碼,如(080) 123-4567、511 254 6654等?!盶(?”代表一個或零個左小括號”(“, 而”[( ]”代表查找一個右小括號”)”或空格符,”\s?”指一個或零個空格符組。但這樣的re會將類似”800) 45-3321”這樣的電話找出 來,也就是括號沒有對稱平衡的問題,之后會學到擇一(alternatives)來決解這樣的問題。
不包含在某特定字符組里(negation)
有時需要查找在包含在某特定字符組里的字符,下表說明如何做類似這樣的描述。
\w 不是字母數(shù)字的任意字符
\s 不是空格符的任意字符
\d 不是數(shù)字字符的任意字符
\b 不在字邊界的位置
[^x] 不是x的任意字符
[^aeiou] 不是a、e、i、o、u的任意字符
15. \s+ (不包含空格符的字符串)
擇一(alternatives)
有時會需要查找?guī)讉€特定的選擇,此時””這個特殊字符就派上用場了,舉例來說,要查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼。
16. \b\d{5}-\d{4}\b\b\d{5}\b (查找五個數(shù)字及九個數(shù)字(有”-”號)的郵政編碼)
在使用alternatives時需要注意的是前后的次序,因為re在alternatives中會優(yōu)先選擇符合最左邊的項目,16中,如果把查找五個數(shù)字的項目放在前面,則這re只會找到五個數(shù)字的郵政編碼。了解了擇一,可將14做更好的修正。