正則表達式

最近在刷真題,遇到了幾個正則表達式的選擇題一律不回,只大概記得本科學習html的時候學過。準備一舉拿下,剷除這個攔路虎。ok,正文開始。
參考教程:菜鳥教程:正則表達式教程
多說一句,菜鳥教程真是個不錯的網站,很適合我這種全忘了的小菜鳥

目錄

1、簡介


正則表達式定義了字符串的模式。
正則表達式可以用來搜索、編輯或處理文本。
正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。

實際上我們常用的字符串其實就是一個簡單的正則表達式,例如 Hello World 正則表達式匹配 “Hello World” 字符串。
運用好正則表達式可以通過簡單的方式實現強大的功能。

下表列出了一些正則表達式的實例及描述:

2、語法


2、1特殊字符


正則表達式 描述
this is text 匹配字符串 “this is text”
this\s+is\s+text \s+ 可以匹配多個空格,\s表示空格。可以匹配的實例:this is text
^\d ^ 匹配輸入輸入字符串的開始位置。可以匹配的實例:”5”, “1.5.5” 和 “2.21.”。
abc$ $ 爲匹配輸入字符串的結束位置。可以匹配的實例:aabc
\babc \b匹配一個字邊界,即字與空格間的位置。可以匹配的實例:abcd
\B \B非字邊界匹配。
[0-9]+ + 號代表前面的字符必須出現一次或多次。可以匹配的實例:123
(\.\d+)? ? 匹配前面的子表達式零次或一次。可以匹配的實例:”5”, “1.5.5” 和 “2.21.”。
(\.\d+)* *匹配前面的子表達式零次或一次或多次。
\d匹配一個數字字符。等價於 [0-9]。
可以匹配的實例:”5”, “1.5” 和 “2.21”。
() ()表示子表達式的開始和結束
{ {標記限定符表達式的開始。
注意:n爲非負整數,{n}表示匹配前一個子表達式n次;{n,}至少匹配n 次;{n,m}最少匹配 n 次且最多匹配 m 次。
\i \i表示不區分大小寫
\g \g表示應用到全局

注:*、+限定符都是貪婪的,因爲它們會儘可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。

2、2選擇

=====

用圓括號將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括號會有一個副作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。
其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者爲正向預查,在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串,後者爲負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。

(pattern)

匹配 pattern 並獲取這一匹配。所獲取的匹配可以從產生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 0 9 屬性。要匹配圓括號字符,請使用 ‘\(’ 或 ‘\)’。

(?:pattern)

匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用 “或” 字符 (|) 來組合一個模式的各個部分是很有用。例如, ‘industr(?:y|ies) 就是一個比 ‘industry|industries’ 更簡略的表達式。

(?=pattern)

正向肯定預查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,”Windows(?=95|98|NT|2000)”能匹配”Windows2000”中的”Windows”,但不能匹配”Windows3.1”中的”Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。

(?!pattern)

正向否定預查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如”Windows(?!95|98|NT|2000)”能匹配”Windows3.1”中的”Windows”,但不能匹配”Windows2000”中的”Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。

(?<=pattern) 反向(look behind)肯定預查,與正向肯定預查類似,只是方向相反。例如,”(?<=95|98|NT|2000)Windows“能匹配”2000Windows“中的”Windows“,但不能匹配”3.1Windows“中的”Windows“。
(?<!pattern) 反向否定預查,與正向否定預查類似,只是方向相反。例如”(?<!95|98|NT|2000)Windows“能匹配”3.1Windows“中的”Windows“,但不能匹配”2000Windows“中的”Windows“。
x|y

匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food”。

[xyz]

字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。

[^xyz]

負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。

[a-z]

字符範圍。匹配指定範圍內的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字符。

[^a-z]

負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 範圍內的任意字符。

2、3反向引用

對一個正則表達式模式或部分模式兩邊添加圓括號將導致相關匹配存儲到一個臨時緩衝區中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩衝區都可以使用 \n 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。
可以使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。
反向引用的最簡單的、最有用的應用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項的能力。

\1 : 表示正則表達式中第一個子表達式匹配的信息被引用

//查找重複的單詞
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));
結果:Is is,of of,up up

解釋:\b匹配字邊界,正則表達式翻譯過來就是,查找符合以下要求的字符 ‘自邊界‘多個字母‘字邊界’ 第一個子表達式匹配到的單詞‘字邊界’並且不區分大小寫應用到全局。

2、4中括號相關

在INTERNET的程序中,正則表達式通常用來驗證用戶的輸入。當用戶提交一個FORM以後,要判斷輸入的電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基於字面的字符是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個表示所有元音字符的字符簇,就把所有的元音字符放在一個方括號裏:

[xyz]

字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。

[^xyz]

負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。

[a-z]

字符範圍。匹配指定範圍內的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字符。

[^a-z]

負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 範圍內的任意字符。

[a-z] //匹配所有的小寫字母
[A-Z] //匹配所有的大寫字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的數字
[0-9.-] //匹配所有的數字,句號和減號

3 正則表達式的練習

點至這裏進行正則表達式的練習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章