本篇主要介紹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...