正則表達式--類型


正則表達式用於字符串處理、表單驗證等場合,實用高效。現將一些常用的表達式收集於此,以備不時之需。

  匹配中文字符的正則表達式: [\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部分

(?!)            零寬負向先行斷言,由於沒有后綴表達式,試圖匹配總是失敗

 

一、抽象和類
 
注意事項及一些要點技巧:
1,使用#ifndef來訪問多次包含同一個文件,防止頭文件被重復引用。(“被重復引用”是指一個頭文件在同一個cpp文件中被include了多次,這種錯誤常常是由於include嵌套造成的。比如:存在a.h文件#include "c.h"而此時b.cpp文件導入了#include "a.h" 和#include "c.h"此時就會造成c.h重復引用。)
格式如下:
[cpp]  view plain  copy
 
  1. #ifndef XX_H  
  2. #define XX_H  
  3. ...  
  4. #endif  
2,使用類對象的程序都可以直接訪問公有部分,但只能通過公有成員函數(或友元函數)來訪問對象的私有成員。private是類對象的默認訪問控制,因此不必在聲明中使用。
3,在類聲明中定義方法等同於用原型替換方法定義,然后在類聲明的后面將定義該寫為內聯函數。
4, 修改實現:
如果要使數字格式保持一致,ostream類包含可用於控制格式的成員函數。
std::cout.setf(std::ios_base::fixed,std::ios_base::floatfield)
即設置了cout對象的一個標記,命令cout使用定點表示法。
 
二、類的析構函數和構造函數
 
程序不能直接訪問數據成員,而必須通過成員函數訪問,才能成功地將對象初始化。一般來說,最好是在創建對象時對它進行初始化。
 
1、 類構造函數
專門用於構造新對象,將值賦給它們的數據成員。程序聲明對象時,將自動調用構造函數。
構造函數與new創建對象的方法(stock為一個類):
Stock *pstock = new Stock("qwe",18,19.0);
總而言之,構造函數被用來創建對象,而不能通過對象來調用。
 
2、 默認構造函數
當且僅當沒有定義任何構造函數時,編譯器才會提供默認構造函數。所以,為類定義了構造函數后,我們就必須為它提供默認構造函數。
定義方式:
① 給已有構造函數的所有參數提供默認值。
② 通過函數重載定義另一個沒有參數的構造函數
創建默認構造函數后,便可以聲明對象變量,而不對它們進行顯示初始化。
 
3, 析構函數
析構函數完成清理工作。如果構造函數使用new來分配內存,則析構函數必須使用delete來釋放這些內存。
 
4, const成員函數
只要類方法不修改調用對象,就應該將其聲明為const。
例如,我們創建了一個Stock對象:const Stock land = Stock("qwew");要使其調用show()函數,則函數聲明應為:void show() const;函數定義的開頭也應該為:void Stock::show() const。
 
三、this指針
 
1, 使用方法
① 在類的非靜態成員函數中返回類對象本身的時候,使用return *this。
② 當參數與成員變量名相同時,如this->n = n。
2, 特點
① 只能在成員函數中使用。
② 在成員函數的開始前構造,在成員函數的結束后清除。
了解了this指針,在實現成員函數例如void Stock::show() const時,我們即可寫做 void show(const Stock *this),其中的數據成員用this->name代替。前端調用如top.show()則可以轉換為show(&top),這樣,將調用的地址賦給了this指針。
 
四、對象數組
 
初始化對象數組的方法:
首先使用默認構造函數創建數組元素,然后花括號中的構造函數將創建臨時對象,然后將臨時對象的值復制到相應的元素中。
 
五、類作用域
 
在類中定義的名稱的作用域為整個類,而該名稱只在該類中是已知的,因此,可以在不同類中使用相同的類成員名而不會引起沖突。
 
創建作用域為類的常量的方法:
① 在類中聲明一個枚舉:
[cpp]  view plain  copy
 
  1. class Bakery{  
  2. private:  
  3.    enum{months = 12};  
  4.    double costs[months];  
  5.    …  
② 使用關鍵字static:
[cpp]  view plain  copy
 
  1. class Bakery  
  2. {  
  3. private:  
  4.    static const int months = 12;  
  5.    double costs[months];  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM