欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
[轉帖]30分鐘正則表達式指導
你是否曾經(jīng)想過(guò)正則表達式是什么,怎樣能夠快速得到對它的一個(gè)基本的認識?我的目的就是在30分鐘內帶你入門(mén)并且對正則表達式有一個(gè)基本的理解。事實(shí)是正則表達式并沒(méi)有它看起來(lái)那么復雜。學(xué)習它最好的辦法就是開(kāi)始寫(xiě)正則表達式并且不斷實(shí)踐。在最初的30分鐘之后,你就應該知道一些基本的結構并且有能力在你的程序或者web頁(yè)面中設計和使用正則表達式了。對那些想要深入研究的人,現在已經(jīng)有很多非常好的可用資源來(lái)讓你更深入的學(xué)習。
到底什么是正則表達式?
我相信你對模式匹配的“計算機通配符”字符應該比較熟悉了。例如,如果你想要在一個(gè)Windows文件夾中找到所有Mircosoft Word文件,你要搜索“*.doc”,因為你知道星號會(huì )被解釋為一個(gè)通配符,它匹配所有序列的字符串。正則表達式就是這種功能的一個(gè)更加細節的擴展。
在寫(xiě)處理文本的程序或者web頁(yè)面時(shí),定位匹配復雜模式的字符串是很常見(jiàn)的。正則表達式就是用來(lái)描述這類(lèi)模式的。這樣,一個(gè)正則表達式就是一個(gè)模式的縮減代碼。例如,模式“\w+”是表達“匹配任何包含字母數字字符的非空字符串”的精確方法。.NET框架提供了一個(gè)功能強大類(lèi)庫,它使得在你的應用程序中包含正則表達式更加容易。使用這個(gè)庫,你可以輕易地搜索和替換文本,解碼復雜的標題,解析語(yǔ)言,或者驗證文本。
學(xué)習正則表達式的神秘的語(yǔ)法的一個(gè)好辦法是用例子作為開(kāi)始學(xué)習的對象,然后實(shí)踐創(chuàng )建自己的正則表達式。
讓我們開(kāi)始吧!
一些簡(jiǎn)單的例子
搜索Elvis
假設你要花費你所有的空余時(shí)間來(lái)掃描文檔來(lái)尋找Elvis仍然活著(zhù)的證據。你可以使用下面的正則表達式來(lái)搜索:
1. elvis -- Find elvis
這是搜索精確字符序列的一個(gè)完全合法的正則表達式。在.NET中,你可以輕松的設置選項來(lái)忽略字符的各種情況,所以這個(gè)表達式將會(huì )匹配“Elivs”,“ELVIS”,或者“eLvIs”。不幸的是,它也將匹配單詞“pelvis”的后五個(gè)字母。我們可以改進(jìn)這個(gè)表達式如下:
2. \belvis\b -- Find elvis as a whole word
現在事情變得更加有趣了?!癨b”是一個(gè)特殊代碼,它表示“匹配任何單詞的開(kāi)頭或結尾的位置”。這個(gè)表達式將只匹配完整的拼寫(xiě)為“elvis”的單詞,無(wú)論是小寫(xiě)的還是大寫(xiě)的情況。
假設你想要找到所有這樣的行,在其中單詞“elvis”后面都跟著(zhù)單詞“alive”。句點(diǎn)或者點(diǎn)“.”是一個(gè)特殊代碼匹配除了換行符之外的任何字符。星號“*”表示重復前面的部分有必要的次數以保證能夠有一個(gè)匹配。這樣,“.*”表示“匹配除了換行符之外的任意數目的字符”?,F在建立一個(gè)表示“搜索在同一行內后面跟著(zhù)單詞‘a(chǎn)live’的單詞‘elvis’”的表達式就是一件簡(jiǎn)單的事了。
3. \belvis\b.*\balive\b -- Find text with "elvis" followed by "alive"
僅僅使用幾個(gè)特殊字符我們就開(kāi)始創(chuàng )建功能強大的正則表達式了,而且它們已經(jīng)開(kāi)始變得難以被我們人類(lèi)理解了。
讓我們看看另一個(gè)例子。
確定電話(huà)號碼的合法性
假設你的web頁(yè)面收集顧客的7位電話(huà)號碼,而且你希望驗證輸入的電話(huà)號碼是正確的格式,“xxx-xxxx”,這里每個(gè)“x”是一個(gè)數字。下面的表達式將搜索整個(gè)文本尋找這樣的一個(gè)字符串:
4. \b\d\d\d-\d\d\d\d -- Find seven-digit phone number
每個(gè)“\d”表示“匹配任何單個(gè)數字”?!?”沒(méi)有特殊的意義并且按照字面解釋?zhuān)ヅ湟粋€(gè)連字符。要避免繁瑣的重復,我們可以使用一個(gè)含有相同含義的速記符:
5. \b\d{3}-\d{4} -- Find seven-digit phone number a better way
“\d”后面的“{3}”表示“重復前面的字符三次”。
.NET正則表達式的基礎
讓我們探索一下.NET中正則表達式的基礎
特殊字符
你應該知道幾個(gè)有特殊意義的字符。你已經(jīng)見(jiàn)過(guò)了“\b”,“.”,“*”,和“\d”。要匹配任何空白字符,像空格,制表符和換行符,使用“\s”。相似地,“\w”匹配任何字母數字字符。
讓我們嘗試更多的例子:
6. \ba\w*\b -- Find words that start with the letter a
這個(gè)搜索一個(gè)單詞的開(kāi)頭(\b),然后是一個(gè)字母“a”,接著(zhù)是任意次數重復的字母數字字符(\w*),最后是一個(gè)單詞的結尾(\b)。
7. \d+ -- Find repeated strings of digits
這里,“+”與“*”是相似的,除了它需要至少一次重復。
8. \b\w{6}\b -- Find six letter words
在Expresso中測試這幾個(gè)表達式,然后實(shí)踐創(chuàng )建你自己的表達式。下面是一個(gè)說(shuō)明有特殊含義的字符的表格:
.  匹配除換行符外的任何字符
\w  匹配任何字母數字字符
\s 匹配任何空白字符
\d 匹配任何數字
\b 匹配一個(gè)單詞的開(kāi)始或結尾
^ 匹配字符串的開(kāi)始
$ 匹配字字符串的結尾
表1 正則表達式的常用特殊字符
開(kāi)始階段
特殊字符“^”和“$”被用來(lái)搜索那些必須以一些文本開(kāi)頭和(或)以一些文本結尾的文本。特別是在驗證輸入時(shí)特別有用,在這些驗證中,輸入的整個(gè)文本必須要匹配一個(gè)模式。例如,要驗證一個(gè)7位電話(huà)號碼,你可能要用:
9. ^\d{3}-\d{4}$ -- Validate a seven-digit phone number
這是和第5個(gè)例子一樣的,但是強迫它符合整個(gè)文本字符串,匹配文本的頭尾之外沒(méi)有其他字符。通過(guò)在.NET中設置“Multiline”選項,“^”和“$”改變他們的意義為匹配一行文本的起點(diǎn)和結束,而不是整個(gè)正文字符串。Expresso的例子使用這個(gè)選項。
換碼字符
當你想要匹配這些特殊字符中的一個(gè)時(shí)會(huì )產(chǎn)生一個(gè)錯誤,像“^”或者“$”。使用反斜線(xiàn)符號來(lái)去掉它們的特殊意義。這樣,“\^”,“\.”,和“\\”,分別匹配文本字符“^”,“.”,和“\”。
重復
你已經(jīng)見(jiàn)過(guò)了“{3}”和“*”可以指定一個(gè)單獨字符的重復次數。稍后,你會(huì )看到相同的語(yǔ)法怎樣用來(lái)重復整個(gè)子表達式。此外還有其他幾種方法來(lái)指定一個(gè)重復,如下表所示:
* 重復任意次數
+ 重復一次或多次
重復一次或多次
{n} 重復n次
{n,m} 重復最少n次,最多m次
{n,} 重復最少n次
表2 常用量詞
讓我們試試幾個(gè)例子:
10. \b\w{5,6}\b -- Find all five and six letter words
11. \b\d{3}\s\d{3}-\d{4} -- Find ten digit phone numbers
12. \d{3}-\d{2}-\d{4} -- Social security number
13. ^\w* -- The first word in the line or in the text
在設置和不設置“Multiline”選項的時(shí)試試最后一個(gè)例子,它改變了“^”的含義。
字符集合
搜索字母數字字符,數字,和空白字符是容易的,但如果你需要搜索一個(gè)字符集合中的任意字符時(shí)怎么辦?這可以通過(guò)在方括號中列出想要的字符來(lái)輕松的解決。這樣,“[aeiou]”就能匹配任意韻母,而“[.?!]”就匹配句子末尾的標點(diǎn)。在這個(gè)例子中,注意“.”和“”在方括號中都失去了他們的特殊意義而被解釋為文本含義。我們也可以指定一個(gè)范圍的字符,所以“[a-z0-9]”表示“匹配任何小寫(xiě)字母或者任何數字”。
讓我們試試一個(gè)搜索電話(huà)號碼的更加復雜的表達式:
14. \(?\d{3}[) ]\s?\d{3}[- ]\d{4} A ten digit phone number
這個(gè)表達式將會(huì )搜索幾種格式的電話(huà)號碼,像“(800)325-3535”或者“650 555 1212”?!癨(?”搜索0個(gè)或1個(gè)左圓括號,“[)]”搜索一個(gè)右圓括號或者一個(gè)空格?!癨s?”搜索0個(gè)或一個(gè)空白字符。不幸的是,它也會(huì )找到像“650)555-1212”這樣括號沒(méi)有去掉的情況。在下面,你會(huì )看到怎樣用可選項解決這個(gè)問(wèn)題。
否定
有些時(shí)候我們需要搜索一個(gè)字符,它不是一個(gè)很容易定義的字符集合的成員。下面的表格說(shuō)明了這種字符怎樣指定:
\W 匹配任何非字母數字字符
\S 匹配任何非空白字符
\D 匹配任何非數字字符
\B 匹配非單詞開(kāi)始或結束的位置
[^x] 匹配任何非x字符
[^aeiou] 匹配任何不在aeiou中的字符
表3 怎樣指定你不想要東西
15. \S+ -- All strings that do not contain whitespace characters
后面,我們會(huì )看到怎樣使用“l(fā)ookahead”和“l(fā)ookbehind”來(lái)搜索缺少更加復雜的模式的情況。
可選項
要從幾個(gè)可選項中選擇,允許符合任何一個(gè)的匹配,使用豎杠“|”來(lái)分隔可選項。例如,郵政編碼有兩種,一個(gè)是5位的,另一個(gè)是9位的加一個(gè)連字符。我們可以使用下面的表達式找到任何一種:
16. \b\d{5}-\d{4}\b|\b\d{5}\b -- Five and nine digit Zip Codes
當使用可選項時(shí),順序是很重要的因為匹配算法將試圖先匹配最左面的選擇。如果這個(gè)例子中的順序顛倒過(guò)來(lái),表達式將只能找到5位的郵政編碼,而不會(huì )找到9位的。我們可以使用可選項來(lái)改進(jìn)十位電話(huà)號碼的表達式,允許包含區碼無(wú)論是通過(guò)空白字符還是連字符劃分的:
17. (\(\d{3}\)|\d{3})\s?\d{3}[- ]\d{4} -- Ten digit phone numbers, a better way
分組
圓括號可以用來(lái)劃分一個(gè)子表達式來(lái)允許重復或者其他特殊的處理,例如:
18. (\d{1,3}\.){3}\d{1,3} -- A simple IP address finder
表達式的第一部分搜索后面跟著(zhù)一個(gè)“\.”的一個(gè)一位到三位的數字。這被放在圓括號中并且通過(guò)使用修飾符“{3}”被重復三次,后面跟著(zhù)與之前一樣的表達式而不帶后綴部分。
不幸的是,這個(gè)例子允許IP地址中被分隔的部分是任意的一位,兩位,或三位數字,盡管一個(gè)合法的IP地址不能有大于255的數字。要是能夠算術(shù)比較一個(gè)獲取的數字N使N<256就好了,但是只用正則表達式是不能夠辦到的。下一個(gè)例子使用模式匹配測試了基于第一位數字的多種可選項來(lái)保證限制數字的取值范圍。這表明一個(gè)表達式會(huì )變得很笨重,盡管搜索模式的描述是簡(jiǎn)單的。
19. ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) -- IP finder
一個(gè)“回引”用來(lái)搜索前面被一個(gè)分組捕獲的已匹配文本的再現。例如,“\1”表示“匹配分組1中已捕獲到的文本”。下面是一個(gè)例子:
20. \b(\w+)\b\s*\1\b -- Find repeated words
它的運行過(guò)程是先捕獲一個(gè)分組1中“(\w+)”表示的至少包含一個(gè)字母數字字符的字符串,但僅當它是一個(gè)單詞的開(kāi)始或結束字符時(shí)才行。然后它搜索任意數量的空白字符“\s*”后跟以被捕獲的文本“\1”結尾的單詞。
在上面的例子中,想要替換分組“(\w+)”這種寫(xiě)法,我們可以把它寫(xiě)成“(?<Word>\w+)”來(lái)給這個(gè)分組命名為“Word”。一個(gè)對這個(gè)分組的回引可以寫(xiě)成“\k<Word>”。試試下面的例子:
21. \b(?<Word>\w+)\b\s*\k<Word>\b -- Capture repeated word in a named group
通過(guò)使用圓括號,有很多可用的特殊用途的語(yǔ)法元素。一些最常用的歸納如下面這張表格:
捕獲
(exp) 匹配exp并且在一個(gè)自動(dòng)計數的分組中捕獲它
(?<name>exp) 匹配exp并且在一個(gè)命名的分組中捕獲它
(?:exp) 匹配exp并且不捕獲它
察看
(?=exp) 匹配任何后綴exp之前的位置
(?<=exp) 匹配任何前綴exp之后的位置
(?!exp) 匹配任何未找到的后綴exp之后的位置
(?<!exp) 匹配任何未找到的前綴exp之前的位置
評論
(?#comment) 評論
表4 常用分組結構
前兩個(gè)我們已經(jīng)說(shuō)過(guò)了。第三個(gè)“(?:exp)”不會(huì )改變匹配行為,它只是不像前兩個(gè)那樣捕獲已命名的或者計數的分組。
確定察看(Positive Lookaround)
下面四個(gè)是所謂的前向或后向斷言。它們從當前的匹配向前或向后尋找需要的東西而不在匹配中包含它們。這些表達式匹配一個(gè)類(lèi)似于“^”或“\b”的位置而不匹配任何文本,理解這個(gè)是很重要的。由于這個(gè)原因,他們也被稱(chēng)為“零寬度斷言”。最好用例子來(lái)解釋它們:
“(?=exp)”是“零寬度確定前向斷言”。它匹配一個(gè)文本中在給定后綴之前的位置,但不在匹配中包含這個(gè)后綴:
22. \b\w+(?=ing\b) -- The beginning of words ending with "ing"
“(?<=exp)”是“零寬度確定后向斷言”。它匹配在給定前綴后面的位置,但不在匹配中包含這個(gè)前綴:
23. (?<=\bre)\w+\b -- The end of words starting with "re"
下面這個(gè)例子可以用來(lái)重復向三位數為一組的數字中插入逗號的例子:
24. (?<=\d)\d{3}\b -- Three digits at the end of a word, preceded by a digit
下面是一個(gè)同時(shí)搜索前綴和后綴的例子:
25. (?<=\s)\w+(?=\s) -- Alphanumeric strings bounded by whitespace
否定察看(Negative Lookaround)
之前,我說(shuō)明了怎樣搜索一個(gè)不是特定字符或一個(gè)字符集合的成員的字符。那么如果我們想要簡(jiǎn)單的驗證一個(gè)字符沒(méi)有出現,但是不想匹配任何東西怎么辦?例如,如果我們想要搜索其中“q”不是后跟著(zhù)“u”的單詞怎么辦?我們可以嘗試:
26. \b\w*q[^u]\w*\b -- Words with "q" followed by NOT "u"
運行例子你就會(huì )看到如果“q”是一個(gè)單詞的最后一個(gè)字母就不會(huì )匹配,比如“Iraq”。這是因為“[^q]”總是匹配一個(gè)字符。如果“q”是單詞的最后一個(gè)字符,它會(huì )匹配后面跟著(zhù)的空白字符,所以這個(gè)例子中表達式結束時(shí)匹配兩個(gè)完整的單詞。否定察看可以解決這個(gè)問(wèn)題,因為它匹配一個(gè)位置而不消耗任何文本。與確定察看一樣,它也可以用來(lái)匹配一個(gè)任意復雜的子表達式的位置,而不僅僅是一個(gè)字符。我們現在可以做得更好:
27. \b\w*q(?!u)\w*\b -- Search for words with "q" not followed by "u"
我們使用“零寬度否定前向斷言”,“(?!exp)”,只有當后綴“exp”沒(méi)有出現時(shí)它才成功。下面是另一個(gè)例子:
28. \d{3}(?!\d) -- Three digits not followed by another digit
相似地,我們可以使用“(?<!exp)”,“零寬度否定后向斷言”,來(lái)搜索文本中的一個(gè)位置,這里前綴“exp”沒(méi)有出現:
29. (?<![a-z ])\w{7} -- Strings of 7 alphanumerics not preceded by a letter or space
這里是另一個(gè)使用后向的例子:
30. (?<=<(\w+)>).*(?=<\/\1>) -- Text between HTML tags
這個(gè)使用后向搜索一個(gè)HTML標記,而使用前向搜索對應的結束標記,這樣,就能獲得中間的文本而不包括兩個(gè)標記。
評論
標點(diǎn)的另一個(gè)用法是使用“(?#comment)”語(yǔ)法包含評論。一個(gè)更好的辦法是設置“Ignore Pattern Whitespace”選項,它允許空白字符插入表達式然后當使用表達式時(shí)忽略它。設置了這個(gè)選項之后,任何文本每行末尾在數字符號“#”后面的東西都被忽略。例如,我們可以格式化先前的例子如下:
31. Text between HTML tags, with comments
(?<=    # Search for a prefix, but exclude it
<(\w+)> # Match a tag of alphanumerics within angle brackets
)          # End the prefix
.*        # Match any text
(?=     # Search for a suffix, but exclude it
<\/\1>  # Match the previously captured tag preceded by "/"
)         # End the suffix
貪婪與懶惰
當一個(gè)正則表達式有一個(gè)可以接受一個(gè)重復次數范圍的量詞(像“.*”),正常的行為是匹配盡可能多的字符??紤]下面的正則表達式:
32. a.*b -- The longest string starting with a and ending with b
如果這被用來(lái)搜索字符串“aabab”,它會(huì )匹配整個(gè)字符串“aabab”。這被稱(chēng)為“貪婪”匹配。有些時(shí)候,我們更喜歡“懶惰”匹配,其中一個(gè)匹配使用發(fā)現的最小數目的重復。表2中所有的量詞可以增加一個(gè)問(wèn)號“”來(lái)轉換到“懶惰”量詞。這樣,“*?”的意思就是“匹配任何數目的匹配,但是使用達到一個(gè)成功匹配的最小數目的重復”?,F在讓我們試試懶惰版本的例子(32):
33. a.*?b -- The shortest string starting with a and ending with b
如果我們把這個(gè)應用到相同的字符串“aabab”,它會(huì )先匹配“aab”然后匹配“ab”。
*? 重復任意次數,但盡可能少
+?  匹配一次或多次,但盡可能少
重復零次或多次,但盡可能少
{n,m}? 重復最少n次,但不多于m次,但盡可能少
{n,}? 重復最少n次,但盡可能少
表5 懶惰量詞
我們遺漏了什么?
我已經(jīng)描述了很多元素,使用它們來(lái)開(kāi)始創(chuàng )建正則表達式;但是我還遺漏了一些東西,它們在下面的表中歸納出來(lái)。這些中的很多都在項目文件中使用額外的例子說(shuō)明了。例子編號在這個(gè)表的左列中列出。
\a 報警字符
\b 通常是單詞邊界,但是在一個(gè)字符集合中它表示退格鍵
\t  制表符
34 \r 回車(chē)
\v 垂直制表符
\f 分頁(yè)符
35 \n 換行符
\e ESC
36 \nnn ASCII碼八進(jìn)制數為nnn的字符
37 \xnn 十六進(jìn)制數為nn的字符
38 \unnnn  Unicode碼為nnnn的字符
39 \cN  Control N字符,例如回車(chē)(Ctrl-M)就是\cM
40 \A 字符串的開(kāi)始(像^但是不依賴(lài)于多行選項)
41 \Z 字符串的結尾或者\n之前的字符串結尾(忽略多行)
\z  字符串結尾(忽略多行)
42 \G 當前搜索的開(kāi)始階段
43 \p{name} 命名為name的Unicode類(lèi)中的任何字符,例如\p{IsGreek}
(?>exp) 貪婪子表達式,也被稱(chēng)為非回溯子表達式。它只匹配一次然后就不再參與回溯。
44 (?<x>-<y>exp) or (?-<y>exp) Balancing group. This is complicated but powerful. It allows named capture groups to be manipulated on a push down/pop up stack and can be used, for example, to search for matching parentheses, which is otherwise not possible with regular expressions. See the example in the project file.
45 (?im-nsx:exp) 正則表達式選項為子表達式exp
46 (?im-nsx) Change the regular expression options for the rest of the enclosing group
(?(exp)yes|no) The subexpression exp is treated as a zero-width positive lookahead. If it matches at this point, the subexpression yes becomes the next match, otherwise no is used.
(?(exp)yes) Same as above but with an empty no expression
(?(name)yes|no) This is the same syntax as the preceding case. If name is a valid group name, the yes expression is matched if the named group had a successful match, otherwise the no expression is matched.
47 (?(name)yes) Same as above but with an empty no expression
表6 我們遺漏的東西。左端的列顯示了項目文件中說(shuō)明這個(gè)結構的例子的序號
結論
我們已經(jīng)給出了很多例子來(lái)說(shuō)明.NET正則表達式的關(guān)鍵特性,強調使用工具(如Expresso)來(lái)測試,實(shí)踐,然后是用例子來(lái)學(xué)習。如果你想要深入的研究,網(wǎng)上也有很多在線(xiàn)資源會(huì )幫助你更深入的學(xué)習。你可以從訪(fǎng)問(wèn)Ultrapico網(wǎng)站開(kāi)始。如果你想讀一本相關(guān)書(shū)籍,我建議Jeffrey Friedl寫(xiě)的最新版的《Mastering Regular Expressions》。
Code Project中還有很多不錯的文章,其中包含下面的教程:
·An Introduction to Regular Expressions by Uwe Keim
·Microsoft Visual C# .NET Developer's Cookbook: Chapter on Strings and Regular Expressions
注:本文例子可以從Ultrapico網(wǎng)站下載Expresso測試,點(diǎn)這里下載該程序,點(diǎn)這里察看原文。
文章引用地址:http://www.cnblogs.com/supersand/archive/2006/01/20/320695.html
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
正則表達式30分鐘入門(mén)教程
Java學(xué)習筆記之正則表達式
正則表達式總結
正則表達式語(yǔ)法及實(shí)例整理 - 風(fēng)的輪廓 - 博客園
JavaScript 正則表達式上
正則表達式
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久