規則運算式(C++)

文章推薦指數: 80 %
投票人數:10人

本文內容. 正則運算式文法; 文法摘要; 語意詳細資料; 比對和搜尋; 格式旗標; 另請參閱. C++ 標準程式庫支援多個正則運算式文法。

本主題討論使用正則 ... 跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 語言 閱讀英文 儲存 目錄 閱讀英文 儲存 Twitter LinkedIn Facebook 電子郵件 目錄 規則運算式(C++) 發行項 05/02/2022 12位參與者 本文內容 C++標準程式庫支援多個正則運算式文法。

本主題討論使用正則運算式時可用的文法變化。

正則運算式文法 要使用的正則運算式文法是由其中一個std::regex_constants::syntax_option_type列舉值所指定。

這些正則運算式文法定義于std::regex_constants: ECMAScript:這最接近JavaScript和.NET語言所使用的文法。

basic:POSIXbasic正則運算式或BRE。

extended:POSIXextended正則運算式或ERE。

awk:這是extended,但對於非列印字元,它有更多逸出。

grep:這是basic,但也允許分行符號(\n)字元來分隔替代。

egrep:這是extended,但也允許分行符號分隔交替。

根據預設,如果未指定文法,ECMAScript則會假設為。

只能指定一個文法。

您也可以套用數個旗標: icase:比對時忽略大小寫。

nosubs:忽略標示相符(,也就是括弧中的運算式);不會儲存替代專案。

optimize:以更大的建構時間可能費用讓比對更快速。

collate:使用區分地區設定的定序序列(例如表單[a-z]的範圍)。

零個或多個旗標可以與文法結合,以指定正則運算式引擎行為。

如果只指定旗標,ECMAScript則會假設為文法。

元素 元素可以是下列其中一項: 「一般字元」,符合目標序列中的相同字元。

符合目標序列中任何字元的萬用字元'.',但分行符號除外。

格式[expr]的方括號運算式,其符合目標序列中的字元或定序專案,而該集合也位於運算式expr所定義的集合中,或表單[^expr]中,其符合目標序列中的字元或定序專案,而該元素不在運算式expr所定義的集合中。

運算式expr可以包含下列任何組合: 個別字元。

將字元加入至所expr定義的集合。

格式ch1-ch2的字元範圍。

將封閉範圍內[ch1,ch2]值所代表的字元加入至所expr定義的集合。

格式[:name:]的字元類別。

會將具名類別的字元加入至expr定義的這個集合。

格式[=elt=]的等價類別。

會將相當於elt的定序項目加入至expr定義的這個集合。

表單[.elt.]的定序符號。

會將定序項目elt加入到expr定義的這個集合。

「錨點」。

錨點^符合目標序列的開頭。

錨點$符合目標序列的結尾。

表單的擷取群組(子運算式)或\(subexpression\)basicgrep,其符合與分隔符號之間模式相符的目標序列字元序列。

格式\k的識別逸出,其符合目標序列中的字元k。

範例: a符合目標序列,但不符合目標序列"a""B"、"b"或"c"。

.符合所有目標序列"a"、"B"、"b"和"c"。

[b-z]符合目標序列,"b""c"但不符合目標序列"a"或"B"。

[:lower:]符合目標序列"a"、"b"和"c",但不符合目標序列"B"。

(a)會比對目標序列"a",並將擷取群組1與子序列"a"產生關聯,但不符合目標序列"B"、"b"或"c"。

在ECMAScript、basic和grep中,元素也可以是表單\dd的回傳參考,其中dd代表符合目標序列中字元序列的十進位值N,其與第N個擷取群組所比對的字元序列相同。

例如,(a)\1會比對目標序列"aa",因為第一個(且只)擷取群組符合初始序列"a",然後\1符合最終序列"a"。

在中ECMAScript,元素也可以是下列其中一項: 表單(?的非擷取群組:子運算式)。

符合目標序列中由分隔符號之間的模式所比對的字元序列。

格式為、\n、、\r\t或\v的\f有限檔案格式逸出。

這些分別符合目標序列中的換頁字元、新行字元、歸位字元、水平索引標籤和垂直索引標籤。

表單的正判斷提示(=子運算式)。

比對目標序列中與分隔符號之間的模式相符的目標序列字元序列,但不會變更目標序列中的相符位置。

表單的負判斷提示(!subexpression)。

比對目標序列中不符合分隔符號之間的模式的任何字元序列,而且不會變更目標序列中的相符位置。

表單\xhh的十六進位逸出序列。

符合目標序列中由兩個十六進位數字hh表示的字元。

格式\uhhhh的unicode逸出序列。

符合目標序列中由四個十六進位數字hhhh表示的字元。

表單\ck的控制項逸出序列。

符合由字元k所指名的控制字元。

表單\b的字界限判斷提示。

當目標序列的目前位置緊接在「字邊界」之後時相符。

格式\B為的負字界限判斷提示。

比對目標序列中的目前位置不會緊接在字界限之後。

格式為\d、\D、、\s、\S、、\w\W的dsw字元逸出。

為字元類別提供簡短名稱。

範例: (?:a)符合目標序列"a",但"(?:a)\1"無效,因為沒有擷取群組1。

(=a)a符合目標序列"a"。

正判斷提示符合目標序列中的初始序列"a",而正則運算式中的最後"a"一個符合目標序列中的初始"a"序列。

(!a)a不符合目標序列"a"。

a\b.符合目標序列"a~",但不符合目標序列"ab"。

a\B.符合目標序列"ab",但不符合目標序列"a~"。

在中awk,元素也可以是下列其中一項: 檔案格式逸出,格式\\為、\a、、\b\f、\n、\r、\t或\v。

這些分別符合目標序列中的反斜線、警示、退格鍵、換頁字元、新行字元、歸位字元、水平索引標籤和垂直索引標籤。

格式\ooo的八進位逸出序列。

符合目標序列中由一個、兩個或三個八進位數字ooo表示的字元。

重複 除了「正判斷提示」、「負判斷提示」或「錨點」之外的任何項目後面都可接著重複計數。

在和grep中basic,最常見的重複計數形式為{min、max}或\{min,max\}。

後面接著此重複計數形式的專案至少符合最小連續出現次數,且序列符合專案的最大連續出現次數不超過上限。

例如,a{2,3}符合目標序列"aa"和目標序列"aaa",但不符合目標序列"a"或目標序列"aaaa"。

重複計數也可以採用下列其中一個格式: 和中的basicgrep{min}或\{min}。

相當於{min,min}。

和中的basicgrep{min,}或\{min,\}。

相當於{min,unbounded}。

*相當於{0,unbounded}。

範例: a{2}符合目標序列,但不符合目標序列"aa""a"或目標序列"aaa"。

a{2,}會比對目標序列、目標序列"aa""aaa"等等,但不符合目標序列"a"。

a*符合目標序列、目標序列""、目標序列"a""aa"等等。

對於除了basic和grep的所有文法,重複計數也可以採用下列其中一個格式: ?相當於{0,1}。

+相當於{1,unbounded}。

範例: a?會比對目標序列""和目標序列"a",但不符合目標序列"aa"。

a+會比對目標序列"a"、目標序列"aa"等等,但不符合目標序列""。

在中ECMAScript,所有形式的重複計數都可以後面接著指定非窮盡重複的字元?。

串連 規則運算式項目(不論是否有「重複計數」)可串連來形成較長的規則運算式。

結果運算式符合由個別項目所比對之序列串連而成的目標序列。

例如,a{2,3}b符合目標序列"aab"和目標序列"aaab",但不符合目標序列"ab"或目標序列"aaaab"。

替代 在和grep以外的basic所有正則運算式文法中,串連的正則運算式後面可以接著(管道)和另一個串連正則運算式的字元|。

任何數目的串連規則運算式可透過這種方式合併。

結果運算式符合與一個或多個串連規則運算式相符的任何目標序列。

當多個串連的正則運算式符合目標序列時,ECMAScript請選擇符合序列的第一個串連正則運算式做為比對,這稱為第一個比對。

另一個正則運算式文法會選擇達到最長相符專案的專案。

例如,ab|cd符合目標序列"ab"和目標序列"cd",但不符合目標序列"abd"或目標序列"acd"。

在和egrep中grep,分行符號(\n)可用來分隔替代。

子運算式 在basic和grep,子運算式是串連。

在其他規則運算式文法中,子運算式是替代。

文法摘要 下表摘要說明各種規則運算式文法的功能: 元素 basic extended ECMAScript grep egrep awk 使用替代| + + + + 使用替代\n + + 錨點 + + + + + + 反向參考 + + + 括號運算式 + + + + + + 使用擷取群組() + + + + 使用擷取群組\(\) + + 控制項逸出序列 + DSW逸出字元 + 檔案格式逸出 + + 十六進位逸出序列 + 識別逸出 + + + + + + 負判斷提示 + 負字邊界判斷提示 + 非擷取群組 + 非窮盡重複 + 八進位逸出序列 + 一般字元 + + + + + + 正判斷提示 + 使用重複{} + + + + 使用重複\{\} + + 使用重複* + + + + + + 使用?和重複+ + + + + UnicodeEscapeSequence-Unicode逸出序列 + 萬用字元 + + + + + + WordBoundaryAssert-字邊界判斷提示 + 語意詳細資料 錨點 錨點符合目標字串中的位置,而非字元。

^會比對目標字串的開頭,而$符合目標字串的結尾。

上一頁參考 反向參考是一個反斜線,後面接著十進位值N。

它會比對第N個「擷取群組」的內容。

N值不能大於反向參考之前的擷取群組數目。

在basic和grep,N值取決於反斜線後面的十進位數字。

在ECMAScript,N值取決於緊接在反斜線後面的所有十進位數字。

因此,在basic和grep,N值絕不會超過9,即使規則運算式有九個以上的擷取群組。

在ECMAScript,N值是無限制的。

範例: ((a+)(b+))(c+)\3符合目標序列"aabbbcbbb"。

返回參考\3符合第三個擷取群組中的文字,也就是"(b+)"。

它不符合目標序列"aabbbcbb"。

(a)\2無效。

(b(((((((((a))))))))))\10在basic和中ECMAScript有不同的意義。

在中basic,上一個參考是\1。

後端參考會比對第一個擷取群組的內容(,也就是開頭為和結尾)的擷取群組內容,最後一個會比對最後)一個擷取群組的內容,0最後一個(b會比對一般字元0。

在中ECMAScript,上一個參考是\10。

它符合第十個擷取群組,也就是最內部的擷取群組。

方括號運算式 括號運算式會定義一組字元及「定序項目」。

當括號運算式以字元^開頭時,如果集合中沒有任何專案符合目標序列中的目前字元,則比對成功。

否則,如果集合中有與目標序列中的目前字元相符的任何一個項目,比對成功。

字元集可以透過列出「個別字元」、「字元範圍」、「字元類別」、「等價類別」和「定序符號」的任意組合來定義。

擷取 擷取群組將其內容標記為規則運算式文法中的單一單位,而且會標記符合其內容的目標文字。

與每個擷取群組相關聯的標籤是數字,透過計算標示擷取群組的左括號,直到標示目前擷取群組的左括號所決定。

在這個實作中,擷取群組數目上限是31。

範例: ab+符合目標序列"abb",但不符合目標序列"abab"。

(ab)+不符合目標序列"abb",但符合目標序列"abab"。

((a+)(b+))(c+)會比對目標序列"aabbbc",並將擷取群組1與子序列產生關聯、擷取群組2與子序列"aabbb""aa"、擷取群組3與"bbb",以及擷取群組4與子序列"c"。

字元類別 括號運算式中的字元類別會將具名類別中的所有字元加入至括號運算式所定義的字元集。

若要建立字元類別,請使用[:後面接著類別的名稱,後面接著:]。

在內部,字元類別名稱是透過呼叫id=traits.lookup_classname所辨識。

如果ch傳回true,字元traits.isctype(ch,id)屬於這種類別。

預設regex_traits範本支援下表中的類別名稱。

類別名稱 描述 alnum 小寫字母、大寫字母和數字 alpha 小寫字母和大寫字母 blank 空格或定位鍵 cntrl 「檔案格式逸出」字元 digit 數字 graph 小寫字母、大寫字母、數字和標點符號 lower 小寫字母 print 小寫字母、大寫字母、數字、標點符號和空格 punct 標點符號 space space upper 大寫字元 xdigit digits,,a,cb,CEDdefABF d 與相同digit s 與相同space w 與相同alnum 字元範圍 括號運算式中的字元範圍會將範圍中的所有字元加入至括號運算式所定義的字元集。

若要建立字元範圍,請將字元'-'放在範圍中的第一個字元與最後一個字元之間。

字元範圍會將數值大於或等於第一個字元的數值,以及小於或等於最後一個字元的數值的所有字元放入集合中。

請注意,這組加入的字元取決於平台特定的字元表示。

如果字元'-'發生在括號運算式的開頭或結尾,或是做為字元範圍的第一個字元或最後一個字元,則它本身會代表它。

範例: [0-7]代表字元集{0,,1,2,3,4,5,,67}。

它會比對目標序列"0"、"1"等等,但不符合"a"。

在使用ASCII字元編碼的系統上,[h-k]代表字元集{h、i、j}k。

它會比對目標序列"h"、"i"等等,但不符合"\x8A"或"0"。

在使用EBCDIC字元編碼的系統上,[h-k]代表字元集{h、i'\x8C''\x8A''\x8B'、'\x8D''\x8E'j'\x8F'k'\x90'}(h編碼為0x88,並k編碼為0x92)。

它會比對目標序列"h"、"i"、"\x8A"等等,但不符合"0"。

[-0-24]代表字元集{-、、01、2、4}。

[0-2-]代表字元集{0,1,,2-}。

在使用ASCII字元編碼的系統上,[+--]代表一組字元{+,-}。

不過,當使用區分地區設定的範圍時,範圍中的字元取決於地區設定的定序規則。

在範圍定義中第一個字元後定序的字元,以及在範圍定義中最後一個字元前定序的字元是在這個集合中。

兩個結尾字元也在這個集合中。

定序專案 定序項目是視為單一字元的多字元序列。

定序符號 括號運算式中的定序符號會將「定序項目」加入至括號運算式所定義的集合。

若要建立定序符號,請使用[.,後面接著定序專案,後面接著.] 控制逸出序列 控制項逸出序列是反斜線,後面接著字母'c'後面接著其中一個字母'a'到'z'或'A'到'Z'。

它符合由該字元所指名的ASCII控制字元。

例如,"\ci"符合目標序列"\x09",因為Ctrl+I具有值0x09。

DSW字元逸出 DSW逸出字元是字元類別的簡短名稱,如下表所示。

逸出序列 對等具名類別 預設具名類別 \d [[:d:]] [[:digit:]] \D [^[:d:]] [^[:digit:]] \s [[:s:]] [[:space:]] \S [^[:s:]] [^[:space:]] \w [[:w:]] [a-zA-Z0-9_]* \W [^[:w:]] [^a-zA-Z0-9_]* *ASCII字元集 等價類別 括號運算式中的等價類別會將相當於等價類別定義中之定序項目的所有字元及「定序項目」加入至括號運算式所定義的集合。

若要建立等價類別,請使用[=,後面接著定序專案,後面接著=]。

在內部,如果elt1,則兩個定序項目elt2和traits.transform_primary(elt1.begin(),elt1.end())==traits.transform_primary(elt2.begin(),elt2.end())相等。

檔案格式逸出 檔案格式逸出是由一般C語言字元逸出序列、\\、、\a、\b、\f、\n、\r、\t、\v所組成。

這些有一般意義,也就是反斜線、警示、退格空間、表單摘要、分行符號、歸位字元、水準索引標籤和垂直索引標籤。

在中ECMAScript,\a不允許和\b。

\\允許(,但它是識別逸出,而不是檔案格式逸出)。

十六進位逸出序列 十六進位逸出序列是反斜線,後面接著字母x,後面接著兩個十六進位數位(0-9a-fA-F)。

它符合目標序列中值由兩個數字指定的字元。

例如,"\x41"使用ASCII字元編碼時,比對目標序列"a"。

身分識別逸出 識別逸出為反斜線,後面接著單一字元。

它符合該字元。

當字元具有特殊意義時,這是必要的。

使用識別逸出會移除特殊意義。

例如: a*符合目標序列"aaa",但不符合目標序列"a*"。

a\*不符合目標序列"aaa",但符合目標序列"a*"。

識別逸出中允許的一組字元取決於規則運算式文法,如下表所示。

文法 允許的識別逸出字元 basic,grep {(){}.[\*^$} extended,egrep {(){.[\*^$+?|} awk,extended 加上{"/} ECMAScript 所有字元,但可以是識別項一部分的字元除外。

通常,這包括字母、數位、$、_和unicode逸出序列。

如需詳細資訊,請參閱ECMAScript語言規格。

個別字元 括號運算式中的個別字元會將該字元加入至括號運算式所定義的字元集。

括號運算式中除了開頭以外的任何位置,都^代表本身。

範例: [abc]會比對目標序列"a"、"b"和"c",但不符合序列"d"。

[^abc]會比對目標序列"d",但不符合目標序列"a"、"b"或"c"。

[a^bc]符合目標序列"a"、"b"、"c"和"^",但不符合目標序列"d"。

在所有正則運算式文法中,除了之外ECMAScript,如果]是開頭後面的[第一個字元,或是在初始^後面的第一個字元,則表示本身。

範例: []a無效,因為沒有]結束括號運算式。

[]abc]符合目標序列"a"、"b"、"c"和"]",但不符合目標序列"d"。

[^]abc]符合目標序列"d",但不符合目標序列"a"、"b"、"c"或"]"。

在中ECMAScript,使用\]表示方括號運算式中的字元]。

範例: []a會比對目標序列"a",因為方括號運算式是空的。

[\]abc]符合目標序列"a"、"b"、"c"和"]",但不符合目標序列"d"。

負判斷提示 負判斷提示符合任何項目,但其內容除外。

它不會取用目標序列中的任何字元。

例如,(!aa)(a*)比對目標序列"a",並將擷取群組1與子序列"a"產生關聯。

它不符合目標序列"aa"或目標序列"aaa"。

負字界限判斷提示 如果目標字串中的目前位置不是緊接在字界限之後,負字界限判斷提示就會相符。

非擷取群組 非擷取群組會將其內容標示為正則運算式文法中的單一單位,但不會標記目標文字。

例如,(a)(?:b)*(c)比對目標文字"abbc",並將擷取群組1與子序列"a"產生關聯,並將擷取群組2與子序列產生"c"關聯。

非窮盡重複 非窮盡重複使用目標序列中符合模式的最短子序列。

窮盡重複使用最長子序列。

例如,(a+)(a*b)符合目標序列"aaab"。

使用非窮盡重複時,它會將擷取群組1與目標序列開頭的子序列"a"產生關聯,並將擷取群組2與目標序列結尾的子序列"aab"產生關聯。

使用窮盡比對時,它會將擷取群組1與子序列"aaa"產生關聯,並將擷取群組2與子序列產生"b"關聯。

八進位逸出序列 八進位逸出序列是反斜線,後面接著一個、兩個或三個八進位數字(0-7)。

它符合目標序列中值由這些數字指定的字元。

如果所有數位都是0,則序列無效。

例如,\101使用ASCII字元編碼時,比對目標序列"a"。

一般字元 一般字元是目前文法中沒有特殊意義的任何有效字元。

在ECMAScript中,下列字元有特殊意義: ^$\.*+?()[]{}| 在basic和grep中,下列字元有特殊意義: .[\ 此外,在和grep中basic,下列字元在特定內容中使用時具有特殊意義: *在所有情況下,除了正則運算式中的第一個字元或正則運算式中第一個字元之後^的第一個字元,或是擷取群組的第一個字元或擷取群組中第一個字元之後的第一個字元^除外。

^當它是正則運算式的第一個字元時,具有特殊意義。

$當正則運算式的最後一個字元時,具有特殊意義。

在extended、egrep和awk中,下列字元有特殊意義: .[\(*+?{| 此外,在、egrep和awk中extended,下列字元在特定內容中使用時具有特殊意義。

)在符合上述專案時具有特殊意義( ^當它是正則運算式的第一個字元時,具有特殊意義。

$當正則運算式的最後一個字元時,具有特殊意義。

一般字元符合目標序列中的相同字元。

根據預設,這表示如果兩個字元是由相同的值表示,比對成功。

在不區分大小寫的比對,如果ch0,兩個字元ch1和traits.translate_nocase(ch0)==traits.translate_nocase(ch1)相符。

在區分地區設定的比對,如果ch0,兩個字元ch1和traits.translate(ch0)==traits.translate(ch1)相符。

正判斷提示 正判斷提示符合其內容,但不會取用目標序列中的任何字元。

範例: (=aa)(a*)會比對目標序列"aaaa",並將擷取群組1與子序列"aaaa"產生關聯。

(aa)(a*)會比對目標序列"aaaa",並將擷取群組1與目標序列開頭的子序列"aa"產生關聯,並將擷取群組2與目標序列結尾的子序列"aa"產生關聯。

(=aa)(a)|(a)會比對目標序列"a",並將擷取群組1與空序列產生關聯(,因為正判斷提示失敗)和擷取群組2與子序列"a"。

它也會比對目標序列"aa",並將擷取群組1與子序列"aa"產生關聯,並將擷取群組2與空序列產生關聯。

Unicode逸出序列 unicode逸出序列是反斜線,後面接著字母'u',後面接著四個十六進位數位(0-9a-fA-F)。

這符合其值由四個數字指定之目標序列中的字元。

例如,\u0041使用ASCII字元編碼時,比對目標序列"a"。

萬用字元 萬用字元符合目標運算式中新行字元以外的任何字元。

字邊界 在下列情況下,會出現字邊界: 目前字元是在目標序列開頭,而且是文字字元A-Za-z0-9_其中一個。

目前字元位置超過目標序列結尾,而且目標序列中的最後一個字元是其中一個文字字元。

目前的字元是其中一個文字字元,而上述字元則不是。

目前的字元不是單字字元之一,且上述字元為。

字界限判斷提示 若目標字串中的目前位置緊接在「字邊界」之後,字邊界判斷提示就會相符。

比對和搜尋 若要讓規則運算式符合目標序列,整個規則運算式必須符合整個目標序列。

例如,正則運算式bcd符合目標序列"bcd",但不符合目標序列"abcd"或目標序列"bcde"。

若要讓規則運算式搜尋成功,目標序列中某處必須有符合規則運算式的子序列。

搜尋通常會尋找最左邊相符的子序列。

範例: 搜尋目標序列"bcd"中的正則運算式bcd會成功,並符合整個序列。

目標序列"abcd"中的相同搜尋也會成功,並符合最後三個字元。

目標序列"bcde"中的相同搜尋也會成功,並符合前三個字元。

搜尋目標序列"bcdbcd"中的正則運算式bcd會成功,並符合前三個字元。

如果目標序列中某個位置有多個相符的子序列,有兩種方式可以選擇比對模式。

當規則運算式相符時,「第一個相符」會選擇第一個找到的子序列。

「最長相符」會從該位置上相符的子序列中選擇最長的子序列。

如果有一個以上的子序列具有最大長度,則最長相符專案會選擇第一個找到的子序列。

例如,使用第一個比對時,目標序列"abcd"中的正則運算式b|bc搜尋會比對子序列"b",因為交替比對的左側字詞與子序列相符專案;因此,第一個比對不會嘗試替代的右手字詞。

使用最長比對時,相同的搜尋比對會"bc"比對"bc"的時間長於"b"。

如果比對到達目標序列結尾但不失敗,即使它尚未到達正則運算式的結尾,部分比對也會成功。

因此,在部分符合成功後,將字元附加至目標序列可能造成後續部分符合失敗。

不過,在部分比對失敗之後,將字元附加至目標序列,無法讓稍後的部分比對成功。

例如,若有部分相符專案,ab則符合目標序列"a",但不符合"ac"。

格式旗標 ECMAScript格式規則 sed格式規則 取代文字 $& & 符合整個正則運算式的字元序列:[match[0].first,match[0].second) $$ $ \& & $`"(貨幣符號後面接著引號) 符合正則運算式之子序列前面的字元序列:[match.prefix().first,match.prefix().second) $'"(元符號,後面接著正價) 符合正則運算式之子序列後面的字元序列:[match.suffix().first,match.suffix().second) $n \n 符合位置n之擷取群組的字元序列,其中n是介於0到9之間的數位:[match[n].first,match[n].second) \\n \n $nn 符合位置nn擷取群組的字元序列,其中nn是介於10到99之間的數位:[match[nn].first,match[nn].second) 另請參閱 C++標準程式庫概觀 本文內容



請為這篇文章評分?