正規表示式基礎筆記(一)

2021-05-25 13:41:50 字數 3657 閱讀 3971

我自己也寫了一些筆記與大家分享,希望自己順便記一下,也讓各位順便能快速的瀏覽一下他基本的內容。

(1) /b ------代表單詞的開頭或結尾,也就是單詞的分界處。

(2) . ------代表除換行符以外的任意字元。

(3) * ------代表它之前的內容可以連續重複使用任意次以上使整個表示式匹配,可以是0次,1次 或多次。

(4) /d ------匹配一位數字。

(5) /s ------匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等。

(6) /w ------匹配字母、數字、下劃線或數字。

(7) + ------匹配1個或多個連續的字元。

(8) ^ ------匹配字串的開始。

(9) $ ------匹配字串的結束。

(10)字元轉義------可使用/來取消某些字元的特殊意義,如/.和/*。

(11) ? ------前邊的那個單位的東西重複0次或1次,注意是最靠近?那個單位的東西,可能只是乙個字元,亦可能是乙個分組的字串,關於分組可以參考18條。

(12) ------

前邊的那個單位的東西

重複n次。

(13) ------

前邊的那個單位的東西

重複n次或更多次。

(14) ------

前邊的那個單位的東西

重複n到m次。

(15)

[abc123] ------匹配指定的任意乙個字元,我這裡寫的abc

(16) | 分支條件 ------有若干條規則,若滿足其中任意一種規則都應當匹配,具體方法是用|將不同的規則分開。

至此,一些基本的都已經介紹完畢,我們舉幾個例子,使用之前的東西,你可能會更加的清楚明白:

/(?0/d[) -]?/d

怎麼樣,感覺上邊的例子給力嗎,呵呵...只要乙個個分析,還是挺簡單的。

/(代表轉義字元,轉義為(,為何不直接寫(而要用個轉義的方式呢,因為(還有別的用途,這個後邊還會解釋。如果你直接寫個(,計算機可能並不會把它當做字面的(括號來使用,不知道這樣解釋能清楚麼。

接下來是個?,這個大家對照第11條可以知道,它代表之前的那(可出現或不出現。

之後是0.

然後出現轉義字元/d,代表數字。

之後是代表前邊的/d出現兩次,即兩位數字。

之後是[) -],參考15條,它可以是)、 、-中的任意乙個字元

爾後的?應該知道什麼意思了吧。

之後是/d代表匹配8位數字。

這個正規表示式的匹配情況如附圖所示

從圖中看到,對於第3和第4個,我們並不是非常的建議,因為它並不符合實際的要求,此時,我們的第16條派上了用場,更好的正規表示式(但並不完全,期望讀者自己實踐一下)如下:

/(0/d/)/d|0/d[-]?/d

其實,是有一些工具可以用來驗證我們寫的正規表示式是否正確,我給我的資源裡邊傳了乙個,你們可以搜尋下來進行使用,這個工具非常好用,強烈建議!!!!!!

(17) /d-/d|/d------用於匹配美國郵政**的例子,閃光點:這兩個分支條件是否可以互換。

答案為否了。若換成/d|/d-/d的話,那它只會匹配5位郵編和9位郵編的前5位,期望你能理解。即匹配分支條件的時候,將會從左到右的測試每個條件,知道滿足了某分支之後跳出。這提醒我們,對於分支條件,要注意順序。

(18) 分組 ------用小括號指定子表示式,即分組。下邊給個匹配ip的例子,自己可以研究一下:

((2[0-4]/d25[0-5]|[01]?/d?/d)/.)(2[0-4]/d|25[0-5]|[01]?/d?/d)

從上邊這個例子我們可以看到,分組的目的就是要形成乙個單位。

(19) 反義 ------查詢不屬於某個能簡單定義字元類的字元

/w   匹配任意不是字母,數字,下劃線或漢子的字元。

/s    匹配任意不是空白符的字元

/d    匹配任意不是數字的字元

/b    匹配不是單詞開頭或結束的位置

[^x]    匹配出了x以外的任意字元

[^aeiou]   匹配出了aeiou幾個字母外的任意字元

(20) 後向引用 ------用於重複搜尋前面某個分組匹配的文字

每個分組都會擁有乙個組號,規則是從左到右,以左括號為標誌,分別命名為1,2,3...

例如:/b(/w+)/b/s+/1/b用來匹配重複的單詞,注意,只用來匹配重複一次的單詞

如該正規表示式匹配 go go go,則匹配結果是go go。

思考:若要匹配出現任意次的正規表示式應當如何寫呢?下邊給出筆者的乙個思路

(/b(/w+)/b/s*)*/2/b      注意:對於(/w+)這個子表示式當中括號為什麼是必要滴呢?

對於組名,我們可以進行指定,方法:(?/w+)或者(?'word'/w+)

這個時候會將分組(/w+)的組名指定為word。

那如何引用指定的組名?    方法:可使用/k

如上邊的那個例子可以改為:/b(?/w+)/b/s+/k/b

(21)常用分組語法

這部分學的也不是太好,所以講也是非常膚淺,只是我的一點感受而已,呵呵......現給大家列舉出來,可以自己搜搜看。

捕獲:(exp)->匹配exp,並捕獲文字到自動命名的組裡。

(?exp)->匹配exp,並將捕獲文字到名稱為name的分組中,等價於:(?'name'exp)。

(?:exp)->匹配exp,但是不捕獲匹配。

零寬斷言:(?=exp)->匹配exp前面的位置。如:

/b/w+(?=ing/b)   對該例子分析,我們知道它匹配這樣的乙個字串,該字  符串為結尾是ing的單詞的前半部分。如:they are singing !匹配的結果是sing。

閃光點:為什麼匹配的結果不是s?對,因為/b的存在。但是,如果將最後的那個/b去掉的話,同樣匹配的結果是sing,為什麼呢?這涉及到正規表示式的貪婪特性,請再接再厲看完吧,嘿嘿...

(?<=exp) ->匹配exp後面的位置。如:

(?<=/bre)/w+/b  該表示式匹配以re開頭的單詞的後半部分。

(?!exp)->匹配後面跟的不是exp的位置。

(?匹配前面不是exp的位置。

注釋: (?#comment) ->只是用於提供注釋。

(22)貪婪與懶惰

當正規表示式當中包含可能接受重複的限定符時,通常是匹配盡可能多的字元,這稱為貪婪匹配。

例如:a.*b    匹配字串 aabab的結果是aabab。

當然,正規表示式也有想發懶的時候,即它想要匹配盡量少的字元,這稱為懶惰行為。此時只要加乙個?即可。

例如:a.*?b   匹配字串aabab的結果是aab和ab。

然而,你有沒想過,上邊的懶惰匹配結果為什麼不是ab和ab呢?這因為正規表示式還有一條規則,比貪婪與懶惰行為的優先順序更高:最先開始的匹配擁有最高的優先權,the match that begins earliest wins.

懶惰行為的限定符有如下這些:

*?->重複任意次,但盡可能少的重複。

+?->重複一次或多次,但盡可能少的重複。

?? ->重複0次或1次,但盡可能匹配重複1次的。

?->重複n次到m次,但盡可能少的重複。

? ->重複n次或以上,但盡可能少。

至此,筆記已經寫完了,希望對你有幫助。 

基礎正規表示式筆記

筆記 於 鳥哥的linux私房菜 語系的資料會影響到正規表達法的輸出結果,檔案其實記錄的僅有0與1,我們看到的字元文字與數字都是透過編碼表住哪換而來的,由於不同語系的編碼資料並不相同,所有就會造成資料獲取的結果差異。舉例來說,在英文大小寫的編碼順序中,zh tw.big5及c這兩種語系的輸出結果分別...

正規表示式筆記 基礎

常用元字元 匹配除換行符以外的任意字元 w 匹配字母 數字 下劃線 漢字等 w相反 s 匹配任意的空白符 s相反 d 匹配數字 d相反 匹配字串的開始 匹配的是位置 匹配字串的結束 匹配的是位置 注意 s 代表前面開頭的是s,s前面不能有字元。例如 since she job,如果進行匹配,則只匹配...

正規表示式 1 正規表示式基礎

1.正規表示式基礎 正規表示式描述了一種字串匹配的模式,即可以使使用者通過一系列普通字元或特殊字元構建能夠明確描述文字字串的匹配模式,可以用來檢查某個字串是否含有某種子字串,將匹配的子字串做替換或者從某個字串中取出符合某個條件的子字串等。1.1 正規表示式的基本結構 乙個正規表示式就是由普通字元 如...