正規表示式

2021-07-24 17:58:04 字數 3363 閱讀 1890

表示文字規則的一種類似於集合的東西,即匹配某種字串的集合。

簡單點說,在簡單的windows操作中你肯定使用過*的萬用字元,其中*代表任意的字串,

\b分界處字元代表單詞的開頭或者結尾不匹配單詞分割字元中的任何乙個,他自己時匹配乙個位置

\s匹配任意空白字元,包括各,製表符(tab),換行符(\n)等

\w匹配字母或數字或下劃線或漢字等

\d匹配乙個數字

.匹配除了換行符以外的任意字元

*代表的不是字元,也不是位置,而是數量——他指定*前面的內容可以連續重複出現任意次。*.連線到一起就意味著任意數量的不包括換行的字元

+類似於*匹配乙個或者多個,而*可能是0次

^匹配乙個位置——字串的開始

$匹配乙個位置——字串的結束

\字元轉義

語法說明

*重複零次或者更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

[ ]表示乙個字元範圍[0-9]表示\d[a-z0-9a-z]表示\w(只考慮英文本元)

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

|分支條件

0\d-\d|0\d-\d能匹配兩種格式的字串

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

- 分支條件注意條件的順序,分支是從左到右的測試每個條件,如果滿足了某個分支的話就不會管其他的分支。

重複當個字元前面已經說了(直接在字元後面加上限定符),重複多個字元就需要用小括號來制定子表示式(分組)

-(\d\.)\d簡單的ip位址匹配表示式,但是最後匹配到256.555.888.545這種不可能存在的ip位址,大家不要被《24》第三季的編劇給忽悠了……

- 正確的是((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)\.

一般語言中都有非語句,當然正規表示式中肯定也是存在的

**說明

\w匹配任意不是字母,數字,下劃線,漢字的字元

\s匹配任意不是空字元的字元

\d匹配任意非數字的字元

\b匹配不是以單詞開頭或結束的

[^x]

匹配除了x以外得任意字元

[^aeiou]

匹配除了母音字元以外的任意字元

\s+匹配不包含空白符的字串

]+>匹配用尖括號括起來的以a開頭的字串

- 正規表示式中的單詞和老外的單詞不一樣,這裡表示的是多於乙個連續的\w

使用小括號之後指定乙個子表示式後,重新引用匹配這個子表示式就是後項引用的過程,其中每個分組自動分配個組號,規則:從左往右,第乙個為1以此類推。

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,例如「go go」等,其中\1就代表前面的分組(\w+)

- 同時也可以自己指定分組:(?\w+)(或者把尖括號換成』也行:(?'word'\w+)),這樣就把\w+的組名指定為word了,可以使用\k引用分組word。

所以上面的例子就可以寫成\b(?\w+)\b\s+\k\b分類

語法說明

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

(?exp)匹配exp,捕獲內容並命名為name的組

(?:exp)匹配exp,不捕獲匹配的的文字,也不給文字分配組號

零寬斷言

(?=exp)匹配exp前面的位置

(?匹配exp後面的位置

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

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

注釋(?#commment)新增注釋

- (?=exp)僅僅是匹配其中的內容,不會有過多的操作

什麼是零寬斷言,只有小學功底的同學,一定很難理解,不管他叫啥名字了,說白了這個東西就是匹配乙個符合某個表示式前面的表示式。

(?=exp)也叫零寬度正**先行斷言,它斷言自身出現位置後面能匹配表示式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞前面的部分(除ing以外的部分),如「i』m going to study python」這樣將會匹配』go』

同理(?<=exp)為零寬度正回顧後發斷言,(?<=\bro)\w+\b,嘗試下總比看著好

(?<=\s+)\d+(?=\s+)

是前面提及關於正零寬斷言的反義

\b\w*q[^u]\w*\b匹配包含後面不是字母u的單詞q的單詞,但是如果你思維足夠敏捷(我是不行了)你會發現,如果q在單詞的末尾,例如iraq,benq,這個表示式就會出錯。這是因為[^u]總是要匹配乙個字元,所以q在末尾的話他就會匹配單詞的分割符『,』,後面的\w*\b將會匹配下乙個單詞。這個時候我們的主角就出來了,我們的主角只是匹配乙個位置不會消耗 任何字元。上面的例子我們可以這樣解決問題:『\b\w*q(?!u)\w*\b』

零寬度負**先行斷言(?!exp),斷言此位置的後面不能匹配表示式exp,例如\d(?!\d)匹配三個數字且後面不能是數字。

同理我們就知道(?

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元(貪婪模式)考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab 。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配 盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:

a.*?b 匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元) 和ab(第四到第五個字元)

薛丁格的貓和誰的狗

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...