正則入門例項拓展

2022-02-02 02:21:04 字數 3367 閱讀 9645

本篇主要介紹perl(以及其他流派的正則)提供的簡記法(shorthands),以及修改文字中使用的正則環視特性,包括幾個舉例。在看這篇之前,不管你是否精通正則,建議首先看下這篇《正則基礎與細節回顧》,因為強大的正則裡面,需要關注的細節太多了。

\s[ \t]*: 匹配空白

.*: 匹配任何字元..號萬用字元,*任意個數,可以為零。

\b: 單詞分界符

\t: 製表符

\n: 換行符

\r: 回車符

\s: 匹配任何空白符 (space, tab, newline, formfeed, and such)

\s: 除\s之外任何字元

\w: 相當於[a-za-z0-9_]

\w: 除\w之外任何字元,相當於[ˆa-za-z0-9_]

\d: 相當於[0-9]

\d: 除\d之外任何字元,相當於[ˆ0-9]"

perl可以使用$1,$2,$3之類的變數來儲存相對應的(···)括號內的子表示式匹配的文字。子表示式的編號按照開括號出現的先後順序,從1開始,子表示式可以巢狀,比如(washington( dc)?)。我們修改文字,可能會保留某些原文本,那麼使用$1這類的變數就可以實現。簡單的舉乙個例子,比如說我們想給所有的數字加上雙引號,我們可以使用(\d)+匹配到所有的數字後,替換結果用"$1"取代,最終到達我們想要的效果。

(?:···)這種寫法可以用來分組文字,但是並不捕獲。(···)當然也可以分組,但是***就是他們捕獲的文字依然會儲存在特殊的變數中。比如(a\d)+,我們只是想讓字母a和乙個數字組合起來,但是這樣正則依舊會捕獲到括號中的內容並且記錄,雖然看似沒有多大影響,但是對於文字量比較大的檔案,為了增加匹配效率,我們可以使用(?:a\d)+,這個時候再用類似$1這樣的變數,就獲取不到引用的文字了。

我們先來想乙個問題,假如我們有諸如3567657745這樣一批代表數量的數字,一般為了方便,我們會這樣寫3,567,657,745。為了解決這個問題,我們首先想到的是從右向左每隔3個數字加個逗號,並且逗號前面必須有數字,但是正則一般都是從左向右工作的。那麼接下來我們就介紹正則的環視特性。

首先強調的是,環視不匹配任何字元,只匹配文中的特定位置,這一點和單詞分解符\b、錨點^$相似。但是,環視更加通用。

環視有四種型別,參考以下**

型別正規表示式

匹配成功的條件...

肯定順序環視

(?=···)

子表示式能匹配右側文字

否定順序環視

(?!···)

子表示式不能匹配右側文字

肯定逆序環視

(?<=···)

子表示式能匹配左側文字

肯定逆序環視

(?子表示式不能匹配左側文字

了解這些後,我們繼續回到給數字加逗號的問題,首先思考3的倍數,3的倍數很好處理,直接(\d\d\d)+$,加上$來保證數字後面不存在其他字元。,在左邊是數字,我們可以使用(?<=\d)來限定匹配的位置,於是整個正規表示式就是(?<=\d)(?=(\d\d\d)+$)。其實這樣子還是不太好,因為裡面存在括號,括號中的內容會被特定的變數&1等引用,所以我們最好使用只是分組的(?:···)來處理一下,於是變成了(?<=\d)(?=(?:\d\d\d)+$),猛一看上去有點難以理解,但是一步一步看,還是挺清晰的。我們已經知道,環視不會匹配任何字元,只是匹配位置,匹配到這樣的位置後,我們只要插入乙個逗號即可,於是替換文字只需要是,就可以了,我們看下處理前後的效果。

掌握了環視,我們回頭來想一下\b這個單詞分界符,如果單詞分解符的意思是,一側是\w,另外一側不是\w,那麼我們就可以用(?補充一點,剛才我們給數字加逗點中,保證了結尾不是其他字元,那麼像23456323s是匹配不到的,使用了$,千萬要理解清楚,去掉$後將會是這樣子,中匹配到的灰色位置。

為了匹配23456323s,其實這裡只需要結尾不是數字就可以了。我們使用簡記法\d來匹配數字,那麼尾部不是數字就可以使用(?!\d)來表示了,所以最終的正則可以這樣寫(?<=\d)(?=(?:\d\d\d)+(?!\d))

環視型別中,順序和逆序所獲取的支援十分有限(使用也不廣泛),順序比逆序早出現幾年,儘管perl支援兩著,其他語言就難說了,所以接下來我們不使用逆序環視來解決給數值新增逗號問題。(\d)(?=(?:\d\d\d)+(?!\d))左側使用捕獲型括號,替換文字只需要在逗號前面加上$1即可,也就是$1,,同樣到達了我們預期的效果。

更多例項,可以參考《mastering regular expressions》第三版,裡面使用perl語言,舉了諸多例項,有興趣的朋友可以參考下,當然也可以參考中文翻譯版本《精通正規表示式》。希望本篇文章可以幫組你更好的掌握正則。

2 入門示例拓展

perl 是一門功能強大的指令碼語言,誕生於 20 世紀 80 年代,其思想主要來自其他的程式語言 和工具。perl 關於文字處理和正規表示式的許多概念都是來自awk和sed,perl 可以應用於 多平台,文字處理能力極其強大,是 web 的處理中最常使用的工具。perl celsius 30 定義...

ES6正則拓展

字串的正則方法 字串物件共有 4 個方法,可以使用正規表示式 match replace search 和split es6 將這 4 個方法,在語言內部全部呼叫regexp的例項方法,從而做到所有與正則相關的方法,全都定義在regexp物件上 string.prototype.match呼叫reg...

拓展KMP演算法 入門 模板

擴充套件kmp演算法,圖很形象,寫的也很清晰,下面的模板就是出自該部落格文章。拓展kmp是求母串s長度為n和子串t長度為m,求s的每乙個字尾子串與t的字首子串匹配的最長長度。求解模式串t的next陣列,這個函式和下面的函式幾乎相同 void getnext string t,int m,int ne...