正規表示式入門

2021-10-03 05:31:16 字數 2348 閱讀 2551

正規表示式是處理字串最有效的方法之一。最簡單的例子:字串「abc」,正則:b,匹配結果:「b」,在該正則中,會去先匹配字串的第乙個字元a,匹配失敗,然後去匹配第二個字元b,匹配成功,輸出結果(如果沒有全域性查詢的宣告,只會查詢第乙個符合條件的字串)。

日常使用時往往需要各種限制條件來完成更加複雜的匹配。使用限定符,用來表示匹配的次數,除三種常用的限定符外,用{}表示:

限定符含義舉例*

匹配前面的字元或表示式0次或無數次,等價於,可以理解為無限制

字元:haaaa,正則:ha*,匹配結果:haaaa。如果使用正則ho*,則可以匹配到h。

+匹配前面的字元或表示式至少1次,等價於

字元:haaaa,正則:ha+,匹配結果:haaaa。如果使用正則ho+,則匹配失敗,因為o一次也沒有匹配到。

?匹配前面的字元或表示式最多1次,等價於

字元:haaaa,正則:ha?,匹配結果:ha。

匹配前面的字元或表示式n次

如ha可以匹配到haaa,匹配不到haa

匹配前面的字元或表示式最少n次,最多m次

如ha可匹配到ha,haa,haaa。

匹配前面的字元或表示式最少n次

如ha等同於ha+。

貪婪和懶惰

同理,+和?以及都可以與?結合實現最小匹配。如字串aaaabc,正則a??(等同於a?),結果是空,因為正則會盡量少匹配,而去取0次匹配這個值。

定位符用來描述字串或者單詞的邊界

定位符含義舉例^

匹配字串開頭(在集合**現表示否定)

正則^a可以匹配abc,aab等以a開頭的字元

$匹配字串的結尾

正則a$可以匹配bca等以a結尾的字串

\b匹配單詞的邊界,包括單詞的開頭和結尾

^定位字串的開頭,生效的物件是該符號之後的字元,$定位字串的結尾,生效的物件是該符號之前的字元,兩者可以同時使用精確匹配乙個字串。

\b用法與字串首尾定位符類似,需注意該定位符出現的位置,會影響匹配的結果。與之相反,\b可以匹配非單詞邊界,如\bapt可以匹配chapter中的apt,但不能匹配aptitude中的apt。

集合用「」定義,表示可以被匹配的範圍,如[123],表示可以匹配的字元只有1,2,3。[a-z]表示可以匹配所有的小寫字母,在集合中使用^表示否定,如[^0-9] 表示除了0-9以外的字元。如果要匹配多個字元的話還是要一一枚舉,所以也可以使用一些特定的字元來表示:

字元含義

.除了換行符以外的任何字元

\d匹配乙個數字,等價於[0-9]

\d匹配除了0-9以外的字元,等價於[^0-9]

\w匹配包括下劃線在內的單個字元,等價於[a-za-z0-9]

\s匹配包括空格,換行等空白字元

如匹配任何乙個正整數:^[1-9][\d]*$

匹配方式通常用於寫在正規表示式的結尾,如:「/a+/g」。部分語言會作為引數進行傳遞,常用的有i:忽略大小寫;g:全域性模式;m:多行模式。

正如開頭所提,不宣告全域性模式時,正則只會匹配到第乙個符合條件的字串。

分組使用「()」定義,在「()」中的所有字元會被視為乙個整體。比如正則(ab)+會將ab做為乙個整體來使用,正則ab+只有b會受到限定符「+」的影響。在括號中可以使用「|」表示多個可選的分組,如(ab|cd)表示分組可以是ab或者cd。

負向引用

使用分組後,會將分組進行快取,同時生成索引可供呼叫,索引從1開始,用\1表示,代表了第乙個分組,最簡單的應用就是查詢相鄰的重複字元,比如字串:「it is is a book」,使用正則\b(\w+)\s\1\b,輸出結果:is。(\w+)\s捕獲乙個或多個字母以及之後的空格,\1捕獲之前已經快取的分組,\b則確保捕獲到的是乙個完整的單詞。

如果不需要快取分組,使用(?:abc)即可。

注意:在實際應用中,如果存在「()」,匹配成功的話只會返回括號中的內容,多個括號會返回多個括號的內容,在無負向引用的情況下,使用(?:abc)可返回完整結果

消耗字元

一般情況下,正規表示式在匹配的過程中會消耗字元,即已經匹配過的字元不會再次匹配,比如,在全域性模式下用正則a*去匹配字串「haaa」,會得到三個結果:[』』, 『aaa』, 『』],而第三個空結果正是因為前兩次匹配已經消耗了字串,所以會出現空的情況。

如果使用零寬斷言,則可以只匹配位置,不消耗字元:

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

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

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

(?!當遇到關鍵字時,需要使用」\「進行轉義,比如」.「,」*「,」+「等本身帶有意義的符號,如果需要表示這些符號,需進行轉義,寫作」\.「,」\*「,」\+「。

正規表示式 正則入門

先從乙個例子開始正規表示式。書寫乙個匹配手機號的正規表示式,為了方便討論,假定手機號是1開頭,第二位只能是3 5 8中的其中乙個,總共11位的數字,形如13 匹配手機號的正規表示式為 1 358 d 下面介紹此正規表示式中的各個符號的含義。表示字串的開頭,後面緊接著1,表示匹配的字串要以 1 開頭。...

正規表示式入門

對於文字字元,有11個字元被保留作特殊用途。他們是 這些特殊字元也被稱作元字元 不可顯示字元 可以使用特殊字串行來代表某些不可顯示字元 代表tab 0x09 代表回車符 0x0d 代表換行符 0x0a 字符集 字符集是由一對方括號 括起來的字元集合。使用字符集,你可以告訴正規表示式引擎僅僅匹配多個字...

正規表示式入門

老師說過 正規表示式就是用字串讀取字串!學習正規表示式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。假設你在一篇英文 裡查詢hi,你可以使用正規表示式hi。這幾乎是最簡單的正規表示式了,它可以精確匹配這樣的字串 由兩個字元組成,前乙...