《精通正则表达式》读书笔记(1)
聲明:筆記僅供參考,不足之處請(qǐng)見諒。
?
正則表達(dá)式能解決什么實(shí)際問題?
正則表達(dá)式能給你帶來超乎你之前想象的文本處理能力。如常見的簡(jiǎn)單文本替換或查找,雖然普通編輯器的替換或查找能滿足一般的需求了,但是如果要處理稍微復(fù)雜點(diǎn)的替換或查找操作,那么也許你必須手動(dòng)處理了。(如替換或查找文本中的所有Email地址)。
一旦掌握了正則表達(dá)式,你就會(huì)知道它簡(jiǎn)直是無(wú)價(jià)之寶,也難以想象如果沒有它,這日子該怎么過呢?
正則表達(dá)式很神奇,所以很難嗎?
如 果沒有相關(guān)魔術(shù)表演的知識(shí),一定覺得魔術(shù)真的很神奇;就像對(duì)待外語(yǔ)一樣,一旦以掌握了它,它不再是天書了。那么正則表達(dá)式也是如此,如果你沒有正則表達(dá)式 相關(guān)經(jīng)驗(yàn),可能看不懂任何相關(guān)正則表達(dá)式的意義,但是如果你掌握了它,那情況就不一樣了,只要練熟之后,你也可以變魔術(shù)了。
以操作系統(tǒng)上的搜索做類比
相信大家都用過自己所用系統(tǒng)上的搜索來尋找文件吧,如果你沒用過并不代表你不需要哦,只是時(shí)機(jī)未到罷了。
相 信絕大多數(shù)朋友都是Windows的粉絲,那么該操作系統(tǒng)上啟動(dòng)搜索的快捷鍵是Win+F,正如一般軟件啟動(dòng)搜索對(duì)話框的快捷鍵是ctrl+F,只不過針 對(duì)系統(tǒng)的ctrl是Win鍵而已。在操作系統(tǒng)的搜索使用中就有類似正則表達(dá)式的蹤影,比如輸入*.txt,則表示搜索的是以.txt結(jié)尾的文件/文件夾, 此處*是一個(gè)特殊字符,代表任意文本,類似的還有?問好,代表任意的單個(gè)字符。通過這兩個(gè)字符,搜索文件的能力大大增強(qiáng)了,但這絕對(duì)不是正則表達(dá)式,想比 正則表達(dá)式,這里的搜索的能力還是很有限的。
正是應(yīng)這種需求,一種“通用的模式語(yǔ)言”發(fā)展了起來,這種功能強(qiáng)大的模式語(yǔ)言和模式本身被稱為“正則表達(dá)式”(Regular Expression)
以語(yǔ)言作類比
完整的正則表達(dá)式由兩種字符構(gòu)成:特殊字符(稱為“元字符”,如操作系統(tǒng)中搜索時(shí)使用的*,?這種匹配符號(hào),正則表達(dá)式的元字符提供了更強(qiáng)大的描述能力)和普通文本字符(就是其他的文字)。
?
一些元字符等的記錄:
完整的正則表達(dá)式由兩種字符構(gòu)成:特殊字符(元字符)和普通字符(文字)
正則表達(dá)式結(jié)構(gòu)體:[...],即字符組/集,一個(gè)字符組智能匹配且必須匹配單個(gè)字符,字符組內(nèi)部的元字符和外部的元字符概念不同,如在內(nèi)部.?*都不是元字符。
結(jié)構(gòu)體和無(wú)結(jié)構(gòu)體的區(qū)別:在結(jié)構(gòu)體x[abc]y中,表示的是或的意思,即x然后a或b或c然后y。在無(wú)結(jié)構(gòu)體時(shí)xabcy表示的是且的意思,x然后a然后b然后c然后y。
在字符組內(nèi)部的元字符:字符組元字符
-:不在[或[^后面的"-"表示一個(gè)范圍,必須寫著2個(gè)字符中間(應(yīng)該是有間隔的同類字符):[0-9a-z] 0到9和a到z中任意一個(gè)。
^:在[后面的"^"表示匹配排除的,寫在字符組中的第1個(gè):[^..]與[…] 前者匹配任何未列出來的字符,即列出的是不希望匹配的字符;后者匹配列出來的字符。
PS:一個(gè)字符組,即使是排除型字符組,也需要匹配一個(gè)字符。如q[^u]無(wú)法匹配“Iraq”,因q后面無(wú)字符了。
?
(普通)元字符(非字符組中的元字符,當(dāng)然有符號(hào)相同,但作用不同的):
^:行開頭,在字符組內(nèi)部和外部表示的意義不一樣;
$:行結(jié)尾;
.:點(diǎn)號(hào),匹配任意字符;
|:或,把不同的子表達(dá)式組合成一個(gè)總的表達(dá)式,從而使總表達(dá)式能夠匹配任意的子表達(dá)式。子表達(dá)式稱為“多選分支alternative”,一般會(huì)用括號(hào)來劃定多選結(jié)構(gòu)的范圍
():括號(hào),劃定范圍,如多選結(jié)構(gòu)的總表達(dá)式一般用括號(hào)括起來,與其他不相干字符劃分開來。如ga|y和g(a|y)區(qū)別是,前者ga或y,后者ga或gy。另外括號(hào)一般還能夠“記住”它們包含的子表達(dá)式匹配的文本,見反向引用。
? + * 這三個(gè)元字符統(tǒng)稱為量詞,即限定了所作用元素的匹配次數(shù)。
?:可選項(xiàng)元素,作用于問號(hào)前面緊鄰的元素,表示是可選項(xiàng),即有或沒有
+:加號(hào)作用于前面緊鄰的元素,表示能出現(xiàn)一次或多次,即>=1
*:星號(hào)作用于前面緊鄰的元素,表示能出現(xiàn)任意多次或者不出現(xiàn),即>=0
{1,2}:區(qū)間量詞,作用于前面緊鄰的元素,限定其出現(xiàn)的次數(shù)范圍為1-2次
反向引用:容許我們匹配與表達(dá)式先前部分匹配的同樣的文本,即使用先前匹配的東西來再次匹配。一般通過\1這樣的形式表示第一個(gè)記憶的匹配文本。
\<:單詞的起始位置,這種貌似只在egrep中適用
\>:單詞的結(jié)束位置,這種貌似只在egrep中適用
^和$
^cat$ 匹配:行開頭,然后字母,然后行結(jié)尾
^$ 匹配:行開頭,然后行結(jié)尾,即空行(無(wú)任何字符)
^ 匹配:行開頭。無(wú)任何意義,每一行都有開頭
額外的參數(shù):
-i:忽略大小寫,這種寫法在egrep中適用,其它處一般也是通過i來表示,但是寫法不一樣
神奇的轉(zhuǎn)義:轉(zhuǎn)義符\,反斜線
如果需要匹配的某個(gè)字符本身就是元字符,那么需要對(duì)其進(jìn)行轉(zhuǎn)義,如\?,這個(gè)問號(hào)就是轉(zhuǎn)義的了,是普通字符了,不是元字符了。(可能某些工具如egrep某些版本不支持在字符組內(nèi)部使用轉(zhuǎn)義)。PS:在某些用法中,反斜線后面如果跟的不是元字符,那么可能會(huì)有特殊的用途,即組合為元字符,即反過來了。
?
PS:不同語(yǔ)言對(duì)正則表達(dá)式有不同的改進(jìn),因此正則表達(dá)式有很多“流派”。
轉(zhuǎn)載于:https://www.cnblogs.com/yevon/archive/2013/03/11/2935048.html
總結(jié)
以上是生活随笔為你收集整理的《精通正则表达式》读书笔记(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动代码工具
- 下一篇: C#异步编程的实现方式(1)——异步委托