《精通正規表示式》讀書筆記(1)

2022-08-03 12:09:16 字數 2897 閱讀 7640

宣告:筆記僅供參考,不足之處請見諒。

正規表示式能解決什麼實際問題?

正規表示式能給你帶來超乎你之前想象的文字處理能力。如常見的簡單文字替換或查詢,雖然普通編輯器的替換或查詢能滿足一般的需求了,但是如果要處理稍微複雜點的替換或查詢操作,那麼也許你必須手動處理了。(如替換或查詢文字中的所有email位址)。

一旦掌握了正規表示式,你就會知道它簡直是無價之寶,也難以想象如果沒有它,這日子該怎麼過呢?

正規表示式很神奇,所以很難嗎?

如 果沒有相關魔術表演的知識,一定覺得魔術真的很神奇;就像對待外語一樣,一旦以掌握了它,它不再是天書了。那麼正規表示式也是如此,如果你沒有正規表示式 相關經驗,可能看不懂任何相關正規表示式的意義,但是如果你掌握了它,那情況就不一樣了,只要練熟之後,你也可以變魔術了。

以作業系統上的搜尋做模擬

相信大家都用過自己所用系統上的搜尋來尋找檔案吧,如果你沒用過並不代表你不需要哦,只是時機未到罷了。

相 信絕大多數朋友都是windows的粉絲,那麼該作業系統上啟動搜尋的快捷鍵是win+f,正如一般軟體啟動搜尋對話方塊的快捷鍵是ctrl+f,只不過針 對系統的ctrl是win鍵而已。在作業系統的搜尋使用中就有類似正規表示式的蹤影,比如輸入*.txt,則表示搜尋的是以.txt結尾的檔案/資料夾, 此處*是乙個特殊字元,代表任意文字,類似的還有?問好,代表任意的單個字元。通過這兩個字元,搜尋檔案的能力大大增強了,但這絕對不是正規表示式,想比 正規表示式,這裡的搜尋的能力還是很有限的。

正是應這種需求,一種「通用的模式語言」發展了起來,這種功能強大的模式語言和模式本身被稱為「正規表示式」(regular expression)

以語言作模擬

完整的正規表示式由兩種字元構成:特殊字元(稱為「元字元」,如作業系統中搜尋時使用的*,?這種匹配符號,正規表示式的元字元提供了更強大的描述能力)和普通文字字元(就是其他的文字)。

一些元字元等的記錄:

完整的正規表示式由兩種字元構成:特殊字元(元字元)和普通字元(文字)

正規表示式結構體

:[...]

,即字元組/集,

乙個字元組智慧型匹配且必須匹配單個字元

,字元組內部的元字元和外部的元字元概念不同,如在內部

.?*都不是元字元。

結構體和無結構體的區別:

在結構體

x[abc]y

中,表示的是或的意思,即x然後

a或b或

c然後y。在無結構體時

xabcy

表示的是且的意思,x然後

a然後b然後

c然後y。

在字元組內部的元字元:字元組元字元-:

不在[或[^

後面的"-"

表示乙個範圍,必須寫著

2個字元中間(應該是有間隔的同類字元):

[0-9a-z] 0到9

和a到z

中任意乙個。^:在

[後面的

"^"表示匹配排除的,寫在字元組中的第1個:

[^..]

與[…]

前者匹配任何未列出來的字元,即列出的是不希望匹配的字元;後者匹配列出來的字元。ps:

乙個字元組,即使是排除型字元組,也需要匹配乙個字元。如

q[^u]

無法匹配「

iraq

」,因q

後面無字元了。

(普通)元字元(非字元組中的元字元,當然有符號相同,但作用不同的):

^:行開頭,在字元組內部和外部表示的意義不一樣;

$:行結尾;

.:點號,匹配任意字元;

|:或,把不同的子表示式組合成乙個總的表示式,從而使總表示式能夠匹配任意的子表示式。子表示式稱為「

多選分支

alternative

」,一般會用括號來劃定多選結構的範圍

():括號,劃定範圍,如多選結構的總表示式一般用括號括起來,與其他不相干字元劃分開來。如

ga|y

和g(a|y)

區別是,前者ga或

y,後者ga或

gy。另外括號一般還能夠「記住」它們包含的子表示式匹配的文字,見反向引用。

//// ? + *

這三個元字元統稱為量詞,即限定了所作用元素的匹配次數。

?:可選項元素,作用於問號前面緊鄰的元素,表示是可選項,即有或沒有

+:加號作用於前面緊鄰的元素,表示能出現一次或多次,即

>=1

*:星號作用於前面緊鄰的元素,表示能出現任意多次或者不出現,即

>=0

:區間量詞,作用於前面緊鄰的元素,限定其出現的次數範圍為

1-2次

反向引用:容許我們匹配與表示式先前部分匹配的同樣的文字,即使用先前匹配的東西來再次匹配。一般通過

\1這樣的形式表示第乙個記憶的匹配文字。

\<

:單詞的起始位置,這種貌似只在

egrep

中適用\>

:單詞的結束位置,這種貌似只在

egrep

中適用^和$

^cat$

匹配:行開頭,然後字母,然後行結尾

^$ 匹配:行開頭,然後行結尾,即空行(無任何字元)

^ 匹配:行開頭。無任何意義,每一行都有開頭

額外的引數:

-i:忽略大小寫,這種寫法在

egrep

中適用,其它處一般也是通過

i來表示,但是寫法不一樣

神奇的轉義:轉義符

\,反斜線

如果需要匹配的某個字元本身就是元字元,那麼需要對其進行轉義,如

\?,這個問號就是轉義的了,是普通字元了,不是元字元了。(可能某些工具如

egrep

某些版本不支援在字元組內部使用轉義)。

ps:在某些用法中,反斜線後面如果跟的不是元字元,那麼可能會有特殊的用途,即組合為元字元,即反過來了。

ps:不同語言對正規表示式有不同的改進,因此正規表示式有很多「流派」。

《精通正規表示式》讀書筆記

在字元組裡,元字元的定義和意義是完全不一樣的,尤其是連字元 在字元組中,它往往用於匹配乙個範圍,除非它是緊跟在 後面的,這裡它匹配的就是 本身,而不作為範圍識別的用途。所以,要切記,在字元組中,如果 是作為普通字元而不是元字元進行匹配時,一定要將連字元放在最前面,當然,還有另外一種解決辦法是轉義,不...

精通正規表示式(1)

regexp 物件用於規定在文字中檢索的內容。regexp 物件用於規定在文字中檢索的內容。regexp 是正規表示式的縮寫。當您檢索某個文字時,可以使用一種模式來描述要檢索的內容。regexp 就是這種模式。簡單的模式可以是乙個單獨的字元。更複雜的模式包括了更多的字元,並可用於解析 格式檢查 替換...

精通正規表示式 1 正規表示式入門

1 能檢查多個檔案,挑出包含重複單詞的行,高亮標記每個重複單詞 使用標準ansi的轉義字元列 同時必須顯示這行文字來自哪個檔案。2 能跨行查詢,即使兩個單詞乙個在某行末尾而另乙個在下一行的開頭,也算重複單詞。3 能進行不區分大小寫的查詢,例如 the the.重複單詞之間可以出現任意數量的空白字元 ...