正規表示式

2021-08-20 19:26:02 字數 3120 閱讀 1083

正規表示式是在乙個文字中匹配字串的一種模式。

通俗的理解是它類似於你使用過windows/dos下用於檔案查詢的萬用字元

(wildcard)

,也就是*和

?。如果你想查詢某個目錄下的所有的

word

文件的話,你會搜尋

*.doc

。在這裡,

*會被解釋成任意的字串。和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求。

(一)組成:表示式、量詞、斷言

表示式:乙個字元或者一組字元。

量詞:匹配的表示式出現的次數。

斷言:包括^,$等限定符。

(二)內容與使用:

1、元字元:

.  匹配除換行符以外的任意字元

\w 匹配字母或數字或下劃線或漢字

\d 匹配數字

\b 匹配單詞的開始或結束

^ 匹配字串的開始

$ 匹配字串的結束

注意:(1)

其中「^

」在方括號的開始可以表示相反的意思,例如

[^abc]

表示匹配除了a、

b、c的任意字元。

(2)因為在c++中「

\」也是轉義字元,所以在

regexp

中使用它時,需要再轉義一次,比如使用「

\d」就應該寫成「

\\d」,而要使用「

\」本身要寫成「

\\\\

」。因為在字串中,兩個反斜槓被解釋為乙個反斜槓,然後在作為正規表示式,

\\ 則被正規表示式引擎解釋為

\,所以在正規表示式中需要使用四個反斜槓。

(3). 特殊字元在中括號表示式時 如

[.]

只會匹配

.字元,等價於

\.,而非匹配除換行符

\n 外的所有字元。

var str = "runoob.com";

var patt1 = /[.]/;

document.write(str.match(patt1));

2、量詞

* 重複零次或更多次

+ 重複一次或更多次

? 重複零次或一次

重複n次 重複

n次或更多次

重複n到m

次注意:

(1)tag+表示t

後跟著乙個

a後面跟著至少乙個

g,而(

tag)

+表示匹配

tag至少一次。

(2)貪婪與非貪婪:

當正規表示式中包含能接受重複的限定符時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。

例:a.*b,它將會匹配最長的以

a開始,以

b結束的字串。如果用它來搜尋

aabab

的話,它會匹配整個字串

aabab

。要使量詞非貪婪,可以使用setminimal(true)。

3、萬用字元匹配

*星號,匹配任何字元

? 問號,匹配任意乙個字元

中括號,匹配括號中的乙個字元

使用方法:

qregexp rx3

("*.txt"

);rx3. setpatternsyntax( qregexp: :wildcard);

qdebug()<

qdebug()

<<

rx3. exactmatch(" welcome. txt. bak" ); //結果為 false

注意:(1)

如果當前目錄下有目錄名匹配成功,會列出該目錄下所有檔案。

(2)qregexp中

setpatternsyntax

()函式用來在

regexp

和萬用字元間進行切換。

4、反義符

w匹配任意不是字母,數字,下劃線,漢字的字元

\s 匹配任意不是空白符的字元

\d 匹配任意非數字的字元

\b 匹配不是單詞開頭或結束的位置

[^x] 匹配除了x以外的任意字元

5、分組和反向引用

用圓括號將所有選擇項括起來,相鄰的選擇項之間用|分隔。

(\d\.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它:\d匹配1到3位的數字,(\d\.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。

使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號。

例如:在表示式 (a)(b(c)) 中,存在四個這樣的組:

0

(a)(b(c))

1

(a)2

(b(c))

3

(c)6、捕獲

(1)捕獲:所以這樣命名捕獲組是因為在匹配中,儲存了與這些組匹配的輸入序列的每個子串行。捕獲的子串行稍後可以通過 back 引用(反向引用) 在表示式中使用,也可以在匹配操作完成後從匹配器檢索。back 引用 是說在後面的表示式中我們可以使用組的編號來引用前面的表示式所捕獲到的文字序列。

例如:(["']).*\1  

其中使用了分組,\1就是對引號這個分組的引用,它匹配包含在兩個引號或者兩個單引號中的所有字串,如,"abc" 或 " ' " 或 ' " '  ,但是請注意,它並不會對" a'或者 'a"匹配。

(2)非捕獲語法:

以 (?) 開頭的組是純的非捕獲 組,它不捕獲文字 ,也不針對組合計進行計數。就是說,如果小括號中以?號開頭,那麼這個分組就不會捕獲文字,當然也不會有組的編號,因此也不存在back 引用。

例如:(?:a|a)123(?:b)可以匹配a123b或者a123b

(3)使用方式:cap()函式,引數0表示完全匹配,會返回整個的匹配結果。

注意:非捕獲的好處:捕獲組捕獲的內容是被儲存在記憶體中,可供以後使用,比如反向引用就是引用的記憶體中儲存的捕獲組中捕獲的內容。而非捕獲組則不會捕獲文字,也不會將它匹配到的內容單獨分組來放到記憶體中。所以,使用非捕獲組較使用捕獲組更節省記憶體。在實際情況中我們要酌情選用。

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...