正規表示式入門

伊谢尔伦
發布: 2023-03-01 10:30:01
原創
1306 人瀏覽過

cjx最近在做爬蟲的項目,急切需要在頁面中抓取自己想要的內容,但是透過邏輯判斷獲取實在是過於複雜。我很慶幸有正規表示式這個利器,很多事情都能夠輕鬆辦到,cjx之前也有了解一些關於正規表示式的知識。不過一直處於理解不徹底的狀態,很難有效的自己寫一個滿意的正規表示式出來。最近在網路上發現有本Jeffrey E.F.Fried寫的 精通正規表示式。 看了第一章突然發現自己能寫幾個正則了,呵呵~~~ cjx突然有一種從屌絲升級成高富帥的感腳...下面對書上的第一章做了下總結~

行的起始和結束

或許最容易理解的元字符就是脫字符號^和美元符號$了,在檢查一行文本時,^代表一行的開始,$代表結束。

讀者最好養成按照字符來理解正規表示式的習慣。 例如,不要這樣:

  ^cat 匹配以cat開頭的行

而應該這樣理解:

  ^cat 匹配的是以c作為一行的第一個字符,緊接一個a,緊接一個t的文本。

這兩種理解的結果並無差異,但按照字符來解讀更容易明白新遇到的正則表達式的內部邏輯。

 

符合若干字元之一

如果我們需要搜尋的是單字"grey",同時又不確定它是否寫作"gray",就可以使用正規表示式結構體[...]。它容許使用者列出在某處期望的匹配的字符,通常被稱作字符組。

所以,gr[ea]y的意思是:先找到g,跟著的是一個r,然後是一個a或e,最後是一個y。

在字元組內部,字元租元字元 '-' 表示一個範圍: 是完全一樣的。我們也可以隨心所欲地把字元範圍與普通文字結合起來:

[0-9A-Z_!.?] 能夠匹配一個數字、大寫字母、下劃線、驚態號、點號或問號。

 

排除型字元組

用[^...] 來取代 [...] 這個字元組就會符合任何未列出的字元。例如:[^1-6] 匹配了除了1到6以外的任何字元。這個組中開頭的^表示排除,所以這裡列出的不是希望匹配的字符,而是不希望匹配的字符。

 

用點號匹配任意字符

元字符. 是用來匹配任意字符的字符組的簡便寫法。如果我們需要在表達式中使用一個"來匹配任何字元" 的佔位符,用點號就很方便。


匹配任意子表達式

元字符 | 是一個非常簡潔的元字符,它的意思就"或" 。依靠它,我們能夠把不同的子表達式組合一個總的表達式,而這個總的表達式又能夠匹配任意的子表達式。

可選項元素

現在來看color和colour的匹配。它們的差別在於,後面的單字比前面的多一個u,我們可以用coloru?r 來解決這個問題。元字元? (也就是問號)代表可選項。把它加在一個字符的後面,就表示此處容許出現這個字符,不過它的出現並非匹配成功的必要條件。

其他量詞:重複出現

+(加號)和*(星號)的作用與問號類似。元字元+ 表示之前緊鄰的元素出現一次或多次,而* 表示之前緊鄰的元素出現任意多次,或不出現。
接下來看類似


這樣的TAG,它表示一條高度為14的水平線。另外HR 與SIZE 之間必須有一個空格,而等號兩邊可以沒有空格。於是若要找到網頁中這樣的HR,表達式既被寫成
,有的時候HR的SIZE值往往是可變的,還有有可能不存在SIZE屬性。那麼表達式又可以改寫成
。哇哦,真是太神奇了。

括號及反向引用

到目前為止,我們已經見過括號的兩種用途:1.限制多選項的範圍;2.將若干字符組合為一個單元,受問號或星號之類量詞作用。現在我要介紹括號的另外一種用途即反向引用,雖然它在egrep中並不常見(不過流行的GNU版本確實支援這一功能),但在其他工具軟體中很常見。
在支援反向引用的工具軟體中,括號能夠"記憶"其中的子表達式匹配的文本,不論這些文本是什麼,元字符序列1 都能夠記住它們。

當然,在一個表達式中我們可以使用多個括號。再用1、2、3等來表示第一、第二、第三組括號相符的文字。括號是按照開括號'(' 從左到右的出現順序來進行的,所以([a-z])([0-9])12 中的1代表[a-z] 匹配的內容,而2 代表[0- 9]配對的內容。義符來實現這些特殊元符號的匹配。

一些有用的簡記
t    製表符
n   換行符
r    回車符
s   任何空白字符,如空格、換行、tab縮進等所有的空格符
S   任何空格符之外的任何字符🎠 [a-zA-Z0-9] 在w+ 中非常有用,可以用來匹配一個單字
W  除w 之外的任何字符 
d   [0-9],即數字
D   除d 外的任何字符,即[^0-9]


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板