正则表达式入门教程-连载(4)-点符号(.)
點(diǎn)符號(hào)(.)匹配幾乎任何字符
在正則表達(dá)式中,點(diǎn)符號(hào).是最常用的元字符,也是最被濫用的元字符。
點(diǎn)符號(hào).匹配單個(gè)字符,不管是什么字符,為一的例外就是換行符。本教程中所涉及到的正則表達(dá)式,點(diǎn)符號(hào).默認(rèn)情況下不會(huì)匹配一個(gè)換行符,所以這點(diǎn)符號(hào).其實(shí)就是[^\n](Unix環(huán)境下)或者[^\r\n] (Windows 環(huán)境下)的簡(jiǎn)寫。
這個(gè)例外的存在最可能是由于歷史原因。第一個(gè)正則表達(dá)式工具是基于行的,他們一行一行的讀文件,每一行各自去匹配正則表達(dá)式。這個(gè)影響就是,使用這些工具,字符串中不會(huì)出現(xiàn)換行符,所以點(diǎn)符號(hào).不會(huì)去匹配他們?,F(xiàn)在的工具和語(yǔ)言可以讓正則表達(dá)式作用于大字符串甚至整個(gè)文件。本教程中討論的正則表達(dá)式都能設(shè)置成使之匹配包括換行符。 在RegexBuddy, EditPad Pro 或者 PowerGREP中,只需勾選中選項(xiàng)"dot matches newline"。
在Perl中,匹配換行符的模式稱作單行模式。有點(diǎn)不幸的是,這很容易和術(shù)語(yǔ)“多行模式“搞混。多行模式只影響錨,單行模式只影響點(diǎn)符號(hào)(.)。你可通過(guò)在正則表達(dá)式后面加上一個(gè)s來(lái)激活單行模式,例如m/^regex$/s。
其他語(yǔ)言和正則表達(dá)式也采用了Perl的術(shù)語(yǔ)。當(dāng)使用.NET的正則表達(dá)式庫(kù)的時(shí)候,需要通過(guò)指定RegexOptions.Singleline激活單行模式。例如Regex.Match("string", "regex", RegexOptions.Singleline).
在我所知的程序語(yǔ)言和正則表達(dá)式庫(kù)中,激活單行模式除了讓點(diǎn)符號(hào)匹配換行符之外沒(méi)有別的效用。
javascript和VBScript沒(méi)有讓點(diǎn)符號(hào).匹配換行符的選項(xiàng)。著這些語(yǔ)言里,你可以使用字符集,比如 [\s\S] 來(lái)匹配任意字符。這個(gè)字符集匹配一個(gè)空白符包括換行符或者不是空白符,這就邏輯上等于匹配了任何字符。
?保守的使用點(diǎn)符號(hào)點(diǎn)符號(hào).
點(diǎn)符號(hào).是一個(gè)強(qiáng)力的正則字符,讓你變懶。但是點(diǎn)符號(hào).也會(huì)讓你匹配不該匹配的字符。如果你初學(xué)正則表達(dá)式,最初的一些情況你可能不是很清楚。
舉例說(shuō)明。比如要匹配日期mm/dd/yy,但是允許用戶自己選擇分隔符。快速的解決方法是\d\d.\d\d.\d\d.。看上去不錯(cuò),會(huì)匹配02/12/03 。但是麻煩是,它也會(huì)匹配02512703,這不是我們想看到的。
\d\d[- /.]\d\d[- /.]\d\d 才是較好的解決方案。注意,點(diǎn)符號(hào).在字符集中不屬于元字符,所以你不需要轉(zhuǎn)義。
但這個(gè)正則表達(dá)式仍然不完美,因?yàn)樗ヅ?9/99/99,[0-1]\d[- /.][0-3]\d[- /.]\d\d稍微完美一點(diǎn),但是它匹配19/39/99。要多完美,取決于想怎么做。如果用來(lái)驗(yàn)證用戶輸入,這不完美。如果用來(lái)轉(zhuǎn)換數(shù)據(jù)文件,這個(gè)可能就足夠。
使用否定的字符集替代點(diǎn)符號(hào).假設(shè)你想要匹配一個(gè)引號(hào)包括的字符串,聽起來(lái)簡(jiǎn)單。引號(hào)里包含任何個(gè)數(shù)的任何字符,".*"似乎很不錯(cuò),點(diǎn)符號(hào).匹配任何字符,星號(hào)*表示重復(fù)任何次數(shù),包括0,如果你把正則表達(dá)式應(yīng)用于Put a "string" between double quotes這句話,很好的匹配"string"。如果應(yīng)用于 Houston, we have a problem with "string one" and "string two". Please respond.那么匹配的是?"string one" and "string two"。不是我們想要的,因?yàn)樾翘?hào)*是貪婪的。
在日期匹配的例子中,我們用字符集替代點(diǎn)符號(hào)來(lái)改善正則表達(dá)式,這里我們也是相同做法。對(duì)于雙引號(hào)內(nèi)的字符串的定義是錯(cuò)誤的。不想讓任何字符以任何次數(shù)的形式出現(xiàn)在引號(hào)中,而是希望任何不是雙引號(hào)和換行符的字符以任何次數(shù)的形式出現(xiàn)在雙引號(hào)內(nèi)。所以恰當(dāng)?shù)恼齽t表達(dá)式是"[^"\r\n]*"。
總結(jié)
以上是生活随笔為你收集整理的正则表达式入门教程-连载(4)-点符号(.)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Socket编程实践(1) --TCP/
- 下一篇: openstack前世今生