規則運算式 (C++)
C++標準連結庫支援多個正則表達式文法。 本主題討論使用正則表示式時可用的文法變化。
正則表達式文法
要使用的正則表達式文法是由使用其中 std::regex_constants::syntax_option_type
一個列舉值所指定。 這些正規表示式文法定義於 中 std::regex_constants
:
- ECMAScript:這最接近 JavaScript 和 .NET 語言所使用的文法。
- basic:P OSIX basic 正則表達式或 BRE。
- extended:P OSIX extended 正則表達式或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) 或 \(subexpression\) 的擷取群組,其符合目標序列中字元序列中與分隔符之間的模式相符的字元序列。basic grep
- 格式
\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,元素也可以是下列其中一項:
表單的非擷取群組(?: subexpression)。 符合目標序列中由分隔符號之間的模式所比對的字元序列。
格式為 、、、
\t
或的有限檔案格式逸出。\f
\n
\v
\r
這些分別符合目標序列中的換頁字元、新行字元、歸位字元、水平索引標籤和垂直索引標籤。格式 的正判斷提示 (= 子表達式)。 比對目標序列中由分隔符之間的模式比對的字元序列,但不會變更目標序列中的比對位置。
表單 的負判斷提示 (! subexpression)。 比對目標序列中不符合分隔符之間的模式的任何字元序列,而且不會變更目標序列中的比對位置。
格式
\xhh
的十六進位逸出序列。 符合目標序列中由兩個十六進位數字hh
表示的字元。格式
\uhhhh
的 Unicode 逸出序列。 符合目標序列中由四個十六進位數字hhhh
表示的字元。表單
\ck
的控件逸出序列。 符合由字元k
所指名的控制字元。表單
\b
的字邊界判斷提示。 當目標序列的目前位置緊接在「字邊界」之後時相符。格式
\B
為的負字界限判斷提示。 比對目標序列中目前的位置不是緊接在 字邊界之後。格式為 、、
\D
、\s
、\w
\S
\W
的dsw字元逸出。\d
為字元類別提供簡短名稱。
範例:
(?: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
表示的字元。
重複
除了「正判斷提示」、「負判斷提示」或「錨點」之外的任何項目後面都可接著重複計數。 最常見的重複計數類型會採用 和 中的 grepbasic {min、max} 或 \{min,max\} 格式。 後面接著這種重複計數形式的專案會比對至少 最小 連續出現次數,且序列符合元素的連續次數上限不超過 上限 。
例如, a{2,3}
符合目標序列 "aa"
和目標序列 "aaa"
,但不符合目標序列 "a"
或目標序列 "aaaa"
。
重複計數也可以採用下列其中一個格式:
和 中的 basic grep{min} 或 \{min} 。 相當於 {min,min}。
和 中的 basic grep{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所有正則表達式文法中,串連正則表達式後面可以接著字元 |
(pipe) 和另一個串連正則表達式。 任何數目的串連規則運算式可透過這種方式合併。 結果運算式符合與一個或多個串連規則運算式相符的任何目標序列。
當其中一個以上的串連正則表達式符合目標序列時, ECMAScript 請選擇符合序列的第一個正則表達式做為 比對,這稱為第一個相符專案。 其他正則表達式文法會選擇達到 最長相符專案的專案。
例如, ab|cd
符合目標序列 "ab"
和目標序列 "cd"
,但不符合目標序列 "abd"
或目標序列 "acd"
。
在 和 egrep中grep,換行符 (\n
) 可用來分隔交替。
子運算式
在 basic 和 grep,子運算式是串連。 在其他規則運算式文法中,子運算式是替代。
文法摘要
下表摘要說明各種規則運算式文法的功能:
元素 | basic | extended | ECMAScript | grep | egrep | awk |
---|---|---|---|---|---|---|
使用替代 | |
+ | + | + | + | ||
使用替代 \n |
+ | + | ||||
錨點 | + | + | + | + | + | + |
反向參考 | + | + | + | |||
括號運算式 | + | + | + | + | + | + |
使用 擷取群組 () |
+ | + | + | + | ||
使用 擷取群組 \(\) |
+ | + | ||||
控制項逸出序列 | + | |||||
DSW 逸出字元 | + | |||||
檔案格式逸出 | + | + | ||||
十六進位逸出序列 | + | |||||
識別逸出 | + | + | + | + | + | + |
負判斷提示 | + | |||||
負字邊界判斷提示 | + | |||||
非擷取群組 | + | |||||
非窮盡重複 | + | |||||
八進位逸出序列 | + | |||||
一般字元 | + | + | + | + | + | + |
正判斷提示 | + | |||||
使用重複 {} |
+ | + | + | + | ||
使用重複 \{\} |
+ | + | ||||
使用重複 * |
+ | + | + | + | + | + |
使用 ? 和重複 + |
+ | + | + | + | ||
Unicode Escape Sequence - Unicode 逸出序列 | + | |||||
萬用字元 | + | + | + | + | + | + |
Word Boundary Assert - 字邊界判斷提示 | + |
語意詳細數據
錨點
錨點符合目標字串中的位置,而非字元。 ^
會比對目標字串的開頭,而 $
符合目標字串的結尾。
上一頁參考
反向參考是一個反斜線,後面接著十進位值 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
在和 中basicECMAScript有不同的意義。 在 basic中,上一個參考是\1
。 上一個參考會比對第一個擷取群組的內容(也就是開頭(b
為 和 結尾)
的擷取群組內容,並在後一個參考之前結束),而最終0
會比對一般字元0
。 在 ECMAScript中,上一個參考是\10
。 它符合第十個擷取群組,也就是最內部的擷取群組。
括號表達式
括號運算式會定義一組字元及「定序項目」。 當方括號表達式以字元 ^
開頭時,如果集合中沒有任何專案符合目標序列中目前字元,則比對成功。 否則,如果集合中有與目標序列中的目前字元相符的任何一個項目,比對成功。
字元集可以透過列出「個別字元」、「字元範圍」、「字元類別」、「等價類別」和「定序符號」的任意組合來定義。
擷取
擷取群組將其內容標記為規則運算式文法中的單一單位,而且會標記符合其內容的目標文字。 與每個擷取群組相關聯的標籤是數字,透過計算標示擷取群組的左括號,直到標示目前擷取群組的左括號所決定。 在這個實作中,擷取群組數目上限是 31。
範例:
ab+
符合目標序列"abb"
,但不符合目標序列"abab"
。(ab)+
不符合目標序列"abb"
,但符合目標序列"abab"
。((a+)(b+))(c+)
比對目標序列"aabbbc"
,並將擷取群組 1 與子序列"aabbb"
產生關聯、擷取群組 2 與子序列"aa"
、擷取群組 3 與"bbb"
,以及擷取群組 4 與子序列"c"
。
字元類別
括號運算式中的字元類別會將具名類別中的所有字元加入至括號運算式所定義的字元集。 若要建立字元類別,請使用 [:
後面接著 類別的名稱,後面接著 :]
。
在內部,字元類別名稱是透過呼叫 id = traits.lookup_classname
所辨識。 如果 ch
傳回 true,字元 traits.isctype(ch, id)
屬於這種類別。 預設 regex_traits
範本支援下表中的類別名稱。
類別名稱 | 描述 |
---|---|
alnum |
小寫字母、大寫字母和數字 |
alpha |
小寫字母和大寫字母 |
blank |
空格或定位鍵 |
cntrl |
「檔案格式逸出」字元 |
digit |
digits |
graph |
小寫字母、大寫字母、數字和標點符號 |
lower |
小寫字母 |
print |
小寫字母、大寫字母、數字、標點符號和空格 |
punct |
標點符號 |
space |
space |
upper |
大寫字元 |
xdigit |
digits、a 、、b 、d A B e f c 、、 D E C F |
d |
與 digit 相同 |
s |
與 space 相同 |
w |
與 alnum 相同 |
字元範圍
括號運算式中的字元範圍會將範圍中的所有字元加入至括號運算式所定義的字元集。 若要建立字元範圍,請將字元 '-'
放在範圍中的第一個字元與最後一個字元之間。 字元範圍會將具有大於或等於第一個字元之數值且小於或等於最後一個字元之數值的所有字元放入集合中。 請注意,這組加入的字元取決於平台特定的字元表示。 如果字元 '-'
發生在方括號表達式的開頭或結尾,或做為字元範圍的第一個字元或最後一個字元,則表示它本身。
範例:
[0-7]
代表字元集 {0
、、1
、3
2
、4
、5
、、6
7
}。 它會比對目標序列"0"
、"1"
等,但不符合"a"
。在使用 ASCII 字元編碼的系統上,
[h-k]
代表字元集 {h
、i
、j
、k
}。 它會比對目標序列"h"
、"i"
等,但不符合"\x8A"
或"0"
。在使用EBCDIC字元編碼的系統上,
[h-k]
代表字元 {h
、i
、'\x8A'
、'\x8B'
、、'\x90'
'\x8D'
'\x8F'
'\x8E'
'\x8C'
、k
j
} (h
編碼為0x88
,k
並編碼為 )。0x92
它會比對目標序列"h"
、"i"
、"\x8A"
等,但不符合"0"
。[-0-24]
代表字元集 {-
、、0
、1
2
、4
}。[0-2-]
代表字元集 {0
、 、1
2
}-
。在使用 ASCII 字元編碼的系統上,
[+--]
表示字元 {+
,
-
}。
不過,當使用區分地區設定的範圍時,範圍中的字元取決於地區設定的定序規則。 在範圍定義中第一個字元後定序的字元,以及在範圍定義中最後一個字元前定序的字元是在這個集合中。 兩個結尾字元也在這個集合中。
Collating 元素
定序項目是視為單一字元的多字元序列。
定序符號
括號運算式中的定序符號會將「定序項目」加入至括號運算式所定義的集合。 若要建立定序符號,請使用 [.
後面接著定序元素,後面接著 .]
控制逸出序列
控件逸出序列是反斜杠,後面接著字母 '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 語言字元逸出序列、\\
、、、\b
\a
、\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 | plus { " / } |
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 中,下列字元有特殊意義:
.
[
\
此外,在 basic 和 grep中,下列字元在特定內容中使用時具有特殊意義:
*
在所有情況下都有特殊意義,除非它是正則表達式中的第一個字元或正則表達式中第一個字元後面的第一個字元,或是擷取群組的第一個字元或擷取群組中緊接^
初始^
的第一個字元時。^
當它是正則表達式的第一個字元時,具有特殊意義。$
當它是正則表達式的最後一個字元時,具有特殊意義。
在 extended、egrep 和 awk 中,下列字元有特殊意義:
.
[
\
(
*
+
?
{
|
此外,在 extended、 egrep和 awk中,下列字元在特定內容中使用時具有特殊意義。
)
符合上述專案時具有特殊意義(
^
當它是正則表達式的第一個字元時,具有特殊意義。$
當它是正則表達式的最後一個字元時,具有特殊意義。
一般字元符合目標序列中的相同字元。 根據預設,這表示如果兩個字元是由相同的值表示,比對成功。 在不區分大小寫的比對,如果 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*)
比對目標序列,並將擷取群組 1 與目標序列"aaaa"
開頭的子"aa"
序列產生關聯,並將擷取群組 2 與目標序列結尾的子序列"aa"
產生關聯。(=aa)(a)|(a)
比對目標序列,並將擷取群組 1 與空序列"a"
產生關聯(因為正判斷提示失敗)和擷取群組 2 與子序列"a"
。 它也會比對目標序列"aa"
,並將擷取群組 1 與子序列"aa"
產生關聯,並將擷取群組 2 與空序列產生關聯。
Unicode 逸出序列
Unicode 逸出序列是反斜杠,後面接著字母 'u'
後面接著四個十六進位數位 (0-9a-fA-F
)。 這符合其值由四個數字指定之目標序列中的字元。 例如, \u0041
使用 ASCII 字元編碼時,符合目標序列 "a"
。
萬用字元
萬用字元符合目標運算式中新行字元以外的任何字元。
詞語邊界
在下列情況下,會出現字邊界:
目前字元是在目標序列開頭,而且是文字字元
A-Za-z0-9_
其中一個。目前字元位置超過目標序列結尾,而且目標序列中的最後一個字元是其中一個文字字元。
目前的字元是其中一個字字元,而前一個字元則不是。
目前字元不是其中一個字字元,而上述字元為 。
Word 界限判斷提示
若目標字串中的目前位置緊接在「字邊界」之後,字邊界判斷提示就會相符。
比對和搜尋
若要讓規則運算式符合目標序列,整個規則運算式必須符合整個目標序列。 例如,正規表示式 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) |