正則表達式用於字符串處理、表單驗證等場合,實用高效。現將一些常用的表達式收集於此,以備不時之需。
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
評注:匹配中文還真是個頭疼的事,有了這個表達式就好辦了
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
匹配空白行的正則表達式:\n\s*\r
評注:可以用來刪除空白行
匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*? />
評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於復雜的嵌套標記依舊無能為力
匹配首尾空白字符的正則表達式:^\s*|\s*$
評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
評注:表單驗證時很實用
匹配網址URL的正則表達式:[a-zA-z]+://[^\s]*
評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下划線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用
匹配國內電話號碼:\d{3}-\d{8}|\d{4}-\d{7}
評注:匹配形式如 0511-4405222 或 021-87888822
匹配騰訊QQ號:[1-9][0-9]{4,}
評注:騰訊QQ號從10000開始
匹配中國郵政編碼:[1-9]\d{5}(?!\d)
評注:中國郵政編碼為6位數字
匹配身份證:\d{15}|\d{18}
評注:中國的身份證為15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
評注:提取ip地址時有用
匹配特定數字:
^[1-9]\d*$ //匹配正整數
^-[1-9]\d*$ //匹配負整數
^-?[1-9]\d*$ //匹配整數
^[1-9]\d*|0$ //匹配非負整數(正整數 + 0)
^-[1-9]\d*|0$ //匹配非正整數(負整數 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點數
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負浮點數
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點數
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負浮點數(正浮點數 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點數(負浮點數 + 0)
評注:處理大量數據時有用,具體應用時注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下划線組成的字符串
評注:最基本也是最常用的一些表達式
定位符:
\b 定位單詞(字母、數字、漢字或“_”組合的字符串,即由不少於1個“\w”組成)界限。空格、除了“_”的特殊符號及標點符號、換行符、回車符、制表符(Tab)等構成該界限。
^ 定位輸入文本(text)的開頭。
$ 定位輸入文本(text)的結尾(使用了^和$后,pattern和輸入文本進行整體比較)。
重復:
* 指定*前邊的內容可以連續重復任意次(0,1,2...)以使整個表達式得到匹配(下邊的+、?、{}都是同一類限定符)。
+ 可以重復1次或多次的前導字符(類似於*)。
? 可以重復0次或1次的前導字符.
\d 匹配一位數字(0,或1,或2,或……)。
\d{2} 表示匹配兩位重復的數字。
\d{4,} 匹配重復4次或更多次的數字。
\d{3,6} 匹配3~6位的連續重復數字。
常用匹配符:
. 匹配除了換行符以外的任意字符。
\s 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等。
\w 匹配字母、數字、下划線或漢字等一個字符(等價於[a-z0-9A-Z_])。
字符轉義:
\ 使用反斜杠組成“\.”“\\”等格式,來匹配“.”和“\”等字符。
字符類:
[] 字符類。將要查找的字符羅列在[]內。如[aeiou]、[a-g]、[a-z0-9A-Z_]。
復雜的例子:
分支條件:
含義:分枝條件指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。
注意:使用分枝條件時,要注意各個條件的順序。匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。
例子:\(?0\d{2}[) -]?\d{8}可以匹配(010)88886666,或022-22334455,或02912345678等格式的號碼,但也會錯誤匹配到010)12345678或(022-87654321的格式。
改為0\d20\d2[- ]?\d{8}|0\d{2}[- ]?\d{8}。
分組:
用途:用小括號來指定子表達式
(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]) 匹配IP地址。
反義:
用途: 查找或定位不屬於某個能簡單定義的字符類的字符。
\B 定位不是字邊界的任意位置。
\S 匹配任何不是空白的字符。
\W 匹配任意不是字母,數字,下划線,漢字的字符.
\D 匹配任意非數字的字符.
[^x] 匹配除了x以外的任意字符.
[^aeiou]匹配除了x以外的任意字符.
例子:\S+ 匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括號括起來的以a開頭的字符串。
后向引用:
用途:用於重復搜索前面某個分組匹配的文本。例如,\1代表分組1匹配的文本。
注意:分組0對應整個正則表達式。
實際上組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大於未命名的組號。
(exp) 匹配exp,並捕獲文本到自動命名的組里。
(?<name>exp) 匹配exp,並捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號。
例子: \b(\w+)\b\s+\1\b 用來匹配兩次重復的單詞(單詞間有1~多個空白字符)。
零寬斷言:
用途:定位一個位置,但是不對該內容進行匹配。
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋:
(?#comment)
貪婪與懶惰:
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
處理選項:
IgnoreCase(忽略大小寫) 匹配時不區分大小寫。
Multiline(多行模式) 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字符串的開頭和結尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結束前的位置.)
Singleline(單行模式) 更改.的含義,使它與每一個字符匹配(包括換行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表達式中的非轉義空白並啟用由#標記的注釋。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。
平衡組/遞歸匹配:
(?'group') 把捕獲的內容命名為group,並壓入堆棧(Stack)
(?'-group') 從堆棧上彈出最后壓入堆棧的名為group的捕獲內容,如果堆棧本來為空,則本分組的匹配失敗
(?(group)yes|no) 如果堆棧上存在以名為group的捕獲內容的話,繼續匹配yes部分的表達式,否則繼續匹配no部分
(?!) 零寬負向先行斷言,由於沒有后綴表達式,試圖匹配總是失敗
- #ifndef XX_H
- #define XX_H
- ...
- #endif
① 在類中聲明一個枚舉:
- class Bakery{
- private:
- enum{months = 12};
- double costs[months];
- …
- class Bakery
- {
- private:
- static const int months = 12;
- double costs[months];