perlrebackslash - Perl 正規表示式反斜線序列和跳脫
有關 Perl 正規表示式的頂層文件位於 perlre 中。
本文檔描述所有反斜線和跳脫序列。在說明反斜線的角色後,它列出所有在 Perl 正規表示式中具有特殊含義的序列(按字母順序),然後描述每個序列。
大多數序列都在不同的文件中有詳細說明;本文檔的主要目的是提供一個快速參考指南,描述所有反斜線和跳脫序列。
在正規表示式中,反斜線可以執行以下兩個任務之一:它會消除其後字元的特殊含義(例如,\|
匹配一個垂直線,而不是交替),或者它是反斜線或跳脫序列的開頭。
決定其為何物的規則相當簡單:如果反斜線後的字元是 ASCII 標點符號(非字元)字元(也就是任何非字母、數字或底線的字元),則反斜線只會拿掉其後字元的任何特殊意義。
如果反斜線後的字元是 ASCII 字母或 ASCII 數字,則此序列可能是特殊的;如果是,則會列在下方。幾個字母尚未使用,因此用反斜線跳脫它們不會讓它們變成特殊字元。未來的 Perl 版本可能會為它們指定特殊意義,因此如果您已開啟警告,Perl 會在您使用此類序列時發出警告。[1]。
然而,保證反斜線或跳脫序列永遠不會在反斜線後接續標點符號字元,現在不會,未來的 Perl 5 版本也不會。因此,在非字元字元前加上反斜線是安全的。
請注意,反斜線本身是特殊的;如果您想要比對反斜線,您必須用反斜線跳脫反斜線:/\\/
比對單一反斜線。
有一個例外。如果您使用字母數字字元作為您模式的分隔符號(您可能不應出於可讀性考量這麼做),如果您想要比對分隔符號,您必須跳脫分隔符號。Perl 屆時不會發出警告。另請參閱 perlop 中的「引號建構解析的可怕細節」。
那些無法在方括號字元類別(例如 [\da-z]
)中使用的,會標示為 Not in [].
。
\000 Octal escape sequence. See also \o{}.
\1 Absolute backreference. Not in [].
\a Alarm or bell.
\A Beginning of string. Not in [].
\b{}, \b Boundary. (\b is a backspace in []).
\B{}, \B Not a boundary. Not in [].
\cX Control-X.
\d Match any digit character.
\D Match any character that isn't a digit.
\e Escape character.
\E Turn off \Q, \L and \U processing. Not in [].
\f Form feed.
\F Foldcase till \E. Not in [].
\g{}, \g1 Named, absolute or relative backreference.
Not in [].
\G Pos assertion. Not in [].
\h Match any horizontal whitespace character.
\H Match any character that isn't horizontal whitespace.
\k{}, \k<>, \k'' Named backreference. Not in [].
\K Keep the stuff left of \K. Not in [].
\l Lowercase next character. Not in [].
\L Lowercase till \E. Not in [].
\n (Logical) newline character.
\N Match any character but newline. Not in [].
\N{} Named or numbered (Unicode) character or sequence.
\o{} Octal escape sequence.
\p{}, \pP Match any character with the given Unicode property.
\P{}, \PP Match any character without the given property.
\Q Quote (disable) pattern metacharacters till \E. Not
in [].
\r Return character.
\R Generic new line. Not in [].
\s Match any whitespace character.
\S Match any character that isn't a whitespace.
\t Tab character.
\u Titlecase next character. Not in [].
\U Uppercase till \E. Not in [].
\v Match any vertical whitespace character.
\V Match any character that isn't vertical whitespace
\w Match any word character.
\W Match any character that isn't a word character.
\x{}, \x00 Hexadecimal escape sequence.
\X Unicode "extended grapheme cluster". Not in [].
\z End of string. Not in [].
\Z End of string. Not in [].
少數字元有專屬的字元跳脫。下表顯示這些字元,以及它們的 ASCII 碼點(十進位和十六進位)、它們的 ASCII 名稱、ASCII 平台上的控制跳脫,以及簡短說明。(對於 EBCDIC 平台,請參閱 perlebcdic 中的「運算子差異」。)
Seq. Code Point ASCII Cntrl Description.
Dec Hex
\a 7 07 BEL \cG alarm or bell
\b 8 08 BS \cH backspace [1]
\e 27 1B ESC \c[ escape character
\f 12 0C FF \cL form feed
\n 10 0A LF \cJ line feed [2]
\r 13 0D CR \cM carriage return
\t 9 09 TAB \cI tab
\b
僅在字元類別內為退格字元。在字元類別外,單獨的 \b
為字元/非字元邊界,而 \b{}
為其他類型的邊界。
\n
比對邏輯換行。Perl 在從文字檔讀取或寫入文字檔時,會在 \n
和您的作業系統原生換行字元之間轉換。
$str =~ /\t/; # Matches if $str contains a (horizontal) tab.
\c
用於表示控制字元;\c
後面的字元決定建構的數值。例如 \cA
的數值為 chr(1)
,而 \cb
的數值為 chr(2)
,依此類推。詳細內容請參閱 perlop 中的「Regexp Quote-Like Operators」。chr(1)
等在 ASCII 和 EBCDIC 平臺上的意義的完整清單請參閱 perlebcdic 中的「OPERATOR DIFFERENCES」。
請注意,在正規表示式(或雙引號字串)的結尾處單獨使用 \c\
(或加倍)無效。反斜線後面必須接續另一個字元。也就是說,\c\X
對所有字元 X 而言,表示 chr(28) . 'X'
。
若要撰寫與平臺無關的程式碼,您必須改用 \N{NAME}
,例如 \N{ESCAPE}
或 \N{U+001B}
,請參閱 charnames。
助記符:control character。
$str =~ /\cK/; # Matches if $str contains a vertical tab (control-K).
Unicode 字元具有 Unicode 名稱和數字碼點(序數)值。使用 \N{}
建構來透過這些值指定字元。某些字元序列也具有名稱。
若要按名稱指定,字元或字元序列的名稱會置於大括弧之間。
若要透過 Unicode 碼點指定字元,請使用 \N{U+碼點}
格式,其中 碼點 是以十六進位表示的數字,提供 Unicode 指定給所需字元的碼點。通常會使用前導零將數字補齊為 4 位數,但並非必要。因此,\N{U+0041}
表示 LATIN CAPITAL LETTER A
,而且您很少會看到它沒有兩個前導零的寫法。\N{U+0041}
在 EBCDIC 電腦上也表示「A」(在 EBCDIC 電腦上,「A」的序數值並非 0x41)。
空白可以自由插入在括住名稱或碼點的大括弧的旁邊,但必須在括弧內。因此,\N{ U+0041 }
完全合法。
甚至可以使用 charnames 模組為字元和字元序列提供您自己的名稱。這些自訂名稱具有詞彙範圍,因此給定的碼點在不同的範圍中可能有不同的名稱。使用的名稱是 \N{}
展開時生效的名稱。對於雙引號內容中的模式,表示在分析模式時。但對於由單引號分隔的模式,展開會延遲到模式編譯時間,這可能會讓不同的 charnames
翻譯器生效。
(您可能會在偵錯輸出中看到一個展開的內部形式:\N{U+碼點.碼點...}
。...
表示任意數量的這些碼點,以點分隔。這表示字元形成的順序。這只是一個內部形式,可能會變更,您不應嘗試自己使用它。)
助記符:Named 字元。
請注意,以命名或編號字元表示的字元或字元順序,正規表示式引擎會將其視為沒有特殊意義的字元,並且會「照樣」比對。
$str =~ /\N{THAI CHARACTER SO SO}/; # Matches the Thai SO SO character
use charnames 'Cyrillic'; # Loads Cyrillic names.
$str =~ /\N{ZHE}\N{KA}/; # Match "ZHE" followed by "KA".
八進位跳脫字元有兩種形式。每種形式都用於以 8 進位制中指定的碼點來指定字元。
一種形式,從 Perl 5.14 開始提供,看起來像 \o{...}
,其中點代表一個或多個八進位數字。它可用於任何 Unicode 字元。
它被引入,用於避免所有 Perl 中提供的另一種形式的潛在問題。該形式由反斜線後接三個八進位數字組成。這種形式的一個問題是,它看起來完全像舊式反向參考(請參閱下方的「舊式八進位跳脫字元和反向參考之間的消除歧義規則」)。您可以透過永遠將三個數字中的第一個數字設為零來避免這種情況,但這會使 \077 成為可指定的最大碼點。
在某些情況下,反斜線後接兩個或甚至一個八進位數字可能會被解釋為八進位跳脫字元,有時會出現警告,而且由於一些錯誤,有時會出現令人驚訝的結果。此外,如果您要從連接在一起的較小片段中建立正規表示式,並且使用的數字少於三個,則一個片段的開頭可能會被解釋為將數字新增到它之前的片段的結尾。請參閱「絕對參照」以取得更多討論和片段問題的範例。
請注意,以八進位跳脫字元表示的字元,正規表示式引擎會將其視為沒有特殊意義的字元,並且會「照樣」比對。
總之,\o{}
形式始終安全可用,而另一種形式在您使用三個數字精確指定碼點時,可用於碼點 \077。
助記符:0八進位或o八進位。
$str = "Perl";
$str =~ /\o{120}/; # Match, "\120" is "P".
$str =~ /\120/; # Same.
$str =~ /\o{120}+/; # Match, "\120" is "P",
# it's repeated at least once.
$str =~ /\120+/; # Same.
$str =~ /P\053/; # No match, "\053" is "+" and taken literally.
/\o{23073}/ # Black foreground, white background smiling face.
/\o{4801234567}/ # Raises a warning, and yields chr(4).
/\o{ 400}/ # LATIN CAPITAL LETTER A WITH MACRON
/\o{ 400 }/ # Same. These show blanks are allowed adjacent to
# the braces
\000
形式的八進位跳脫字元位於方括號字元類別之外,可能會與舊式反向參照發生衝突(請參閱下方的「絕對參照」)。它們都包含反斜線後接數字。因此,Perl 必須使用啟發式方法來判斷它是反向參照還是八進位跳脫字元。Perl 使用下列規則來消歧義
如果反斜線後接一個數字,則為反向參照。
如果反斜線後接的第一個數字為 0,則為八進位跳脫字元。
如果反斜線後接的數字為 N(以十進位表示),且 Perl 已看到 N 個擷取群組,則 Perl 會將其視為反向參照。否則,它會將其視為八進位跳脫字元。如果 N 有三個以上的數字,Perl 只會取前三個數字作為八進位跳脫字元;其餘數字會照原樣比對。
my $pat = "(" x 999;
$pat .= "a";
$pat .= ")" x 999;
/^($pat)\1000$/; # Matches 'aa'; there are 1000 capture groups.
/^$pat\1000$/; # Matches 'a@0'; there are 999 capture groups
# and \1000 is seen as \100 (a '@') and a '0'.
您可以使用 \g{...}
形式強制反向參照詮釋。您可以使用 \o{...}
形式強制八進位詮釋,或者對於數字到 \077(= 63 十進位)為止,使用三個數字,以「0」開頭。
與八進位跳脫字元類似,十六進位跳脫字元有兩種形式,但都以序列 \x
開頭。其後接兩個十六進位數字形成一個數字,或一個任意長度的十六進位數字,並以大括號括起來。十六進位數字是您要表達的字元的碼點。
請注意,以這些跳脫字元之一表示的字元被正規表示式引擎視為沒有特殊意義的字元,並且會「照原樣」比對。
助記符:hexadecimal。
$str = "Perl";
$str =~ /\x50/; # Match, "\x50" is "P".
$str =~ /\x50+/; # Match, "\x50" is "P", it is repeated at least once
$str =~ /P\x2B/; # No match, "\x2B" is "+" and taken literally.
/\x{2603}\x{2602}/ # Snowman with an umbrella.
# The Unicode character 2603 is a snowman,
# the Unicode character 2602 is an umbrella.
/\x{263B}/ # Black smiling face.
/\x{263b}/ # Same, the hex digits A - F are case insensitive.
/\x{ 263b }/ # Same, showing optional blanks adjacent to the
# braces
許多反斜線序列與變更其後面的字元或字元有關。\l
會將其後面的字元轉換為小寫,而 \u
會將其後面的字元轉換為大寫(或更準確地說,是標題大小寫)。它們提供的功能類似於函式 lcfirst
和 ucfirst
。
若要將多個字元轉換為大寫或小寫,可以使用 \L
或 \U
,它們會將其後面的所有字元轉換為小寫/大寫,直到模式結束或下一個 \E
出現(以先出現者為準)。它們提供的功能類似於函式 lc
和 uc
所提供的功能。
\Q
用於引用(停用)模式元字元,直到下一個 \E
或模式結束。\Q
會為任何可能對 Perl 具有特殊意義的字元加上反斜線。在 ASCII 範圍內,它會引用每個非字母、數字或底線的字元。有關非 ASCII 碼點引用的詳細資訊,請參閱 perlfunc 中的「quotemeta」。使用此功能可確保 \Q
和 \E
之間的任何字元都會以字面意義進行比對,而非由正規表示法引擎解釋為元字元。
\F
可用於將所有後續字元轉換為小寫,直到下一個 \E
或模式結束。它提供與 fc
函數類似的功能。
助記符:Lowercase(小寫)、Uppercase(大寫)、Fold-case(轉換大小寫)、Quotemeta(引用元字元)、End(結束)。
$sid = "sid";
$greg = "GrEg";
$miranda = "(Miranda)";
$str =~ /\u$sid/; # Matches 'Sid'
$str =~ /\L$greg/; # Matches 'greg'
$str =~ /\Q$miranda\E/; # Matches '(Miranda)', as if the pattern
# had been written as /\(Miranda\)/
Perl 正規表示法有廣泛的字元類別。有些字元類別寫成反斜線序列。我們將在此簡要討論這些字元類別;有關字元類別的完整詳細資訊,請參閱 perlrecharclass。
\w
是字元類別,用於比對任何單一字詞字元(字母、數字、Unicode 標記和連接符號,例如底線)。\d
是字元類別,用於比對任何十進位數字,而字元類別 \s
則用於比對任何空白字元。perl 5.10.0 中新增的類別 \h
和 \v
則用於比對水平和垂直空白字元。
\d
、\s
和 \w
比對的字元組會根據各種 pragma 和正規表示法修改器而有所不同。透過使用 /a
正規表示法修改器,可以將比對限制在 ASCII 範圍內。請參閱 perlrecharclass。
大寫變體(\W
、\D
、\S
、\H
和 \V
)是字元類別,分別用於比對任何非字詞字元、數字、空白、水平空白或垂直空白的字元。
助記符:word(字詞)、digit(數字)、space(空白)、horizontal(水平)、vertical(垂直)。
\pP
(其中 P
為單一字母)和 \p{Property}
用於比對符合給定 Unicode 屬性的字元;屬性包含「字母」或「泰文字元」等項目。將順序大寫為 \PP
和 \P{Property}
會讓順序比對不符合給定 Unicode 屬性的字元。如需更多詳細資料,請參閱 perlrecharclass 中的「反斜線順序」 和 perlunicode 中的「Unicode 字元屬性」。
助記符:property(屬性)。
如果在正規表示式中使用擷取括號,我們可以參照原始字串中比對的部分,並比對完全相同的部分。有三個方法可以參照此類反向參照:絕對、相對和依名稱。
\gN
(從 Perl 5.10.0 開始)或 \N
(舊式)其中 N 為任何長度的正數(無符號)十進位數字,是對擷取群組的絕對參照。
N 參照第 N 組括號,因此 \gN
參照該組括號比對的任何內容。因此 \g1
參照正規表示式中的第一個擷取群組。
\gN
形式可以等效寫成 \g{N}
,在透過串接較短字串來建構正規表示式時,這可以避免歧義。否則,如果您有正規表示式 qr/$a$b/
,且 $a
包含 "\g1"
,而 $b
包含 "37"
,您會得到 /\g137/
,這可能不是您想要的。
在 \N
形式中,N 不能以「0」開頭,且必須至少有 N 個擷取群組,否則 N 會被視為八進位跳脫(但像 \18
之類的東西與 \0018
相同;也就是說,八進位跳脫 "\001"
後面跟著一個文字數字 "8"
)。
助記符:group(群組)。
/(\w+) \g1/; # Finds a duplicated word, (e.g. "cat cat").
/(\w+) \1/; # Same thing; written old-style.
/(\w+) \g{1}/; # Same, using the safer braced notation
/(\w+) \g{ 1 }/;# Same, showing optional blanks adjacent to the braces
/(.)(.)\g2\g1/; # Match a four letter palindrome (e.g. "ABBA").
\g-N
(從 Perl 5.10.0 開始)用於相對位址編制。(可以寫成 \g{-N}
。)它參照 \g{-N}
之前的第 N 個群組。
此表單的最大優點是,它能更輕鬆地撰寫具有可內插至較大模式的參照的模式,即使較大模式也包含擷取群組。
/(A) # Group 1
( # Group 2
(B) # Group 3
\g{-1} # Refers to group 3 (B)
\g{-3} # Refers to group 1 (A)
\g{ -3 } # Same, showing optional blanks adjacent to the braces
)
/x; # Matches "ABBA".
my $qr = qr /(.)(.)\g{-2}\g{-1}/; # Matches 'abab', 'cdcd', etc.
/$qr$qr/ # Matches 'ababcdcd'.
\g{名稱}
(從 Perl 5.10.0 開始)可作為命名擷取群組的反向參照,完全不必考慮擷取緩衝區位置。
為了與 .Net 正規表示式相容,\g{name}
也可寫成 \k{name}
、\k<name>
或 \k'name'
。
為了避免任何歧義,名稱 不得以數字開頭或包含連字號。
/(?<word>\w+) \g{word}/ # Finds duplicated word, (e.g. "cat cat")
/(?<word>\w+) \k{word}/ # Same.
/(?<word>\w+) \g{ word }/ # Same, showing optional blanks adjacent to
# the braces
/(?<word>\w+) \k{ word }/ # Same.
/(?<word>\w+) \k<word>/ # Same. There are no braces, so no blanks
# are permitted
/(?<letter1>.)(?<letter2>.)\g{letter2}\g{letter1}/
# Match a four letter palindrome (e.g.
# "ABBA")
斷言是必須為真的條件;它們實際上並未比對子字串的部分。有六個斷言寫成反斜線序列。
\A
僅比對字串開頭。如果未使用 /m
修飾詞,則 /\A/
等於 /^/
。不過,如果使用了 /m
修飾詞,則 /^/
會比對內部換行,但 /\A/
的意義不會因 /m
修飾詞而改變。\A
會比對字串開頭,不論是否使用了 /m
修飾詞。
\z
和 \Z
比對字串結尾。如果未使用 /m
修飾詞,則 /\Z/
等於 /$/
;也就是說,它會比對字串結尾,或字串結尾前一個換行。如果使用了 /m
修飾詞,則 /$/
會比對內部換行,但 /\Z/
的意義不會因 /m
修飾詞而改變。\Z
會比對字串結尾(或尾隨換行前),不論是否使用了 /m
修飾詞。
\z
與 \Z
相同,但它不會與尾隨換行符號相符。\z
僅與字串結尾相符,不論使用何種修飾詞,而並非僅在換行符號之前。這是將比對錨定在所有情況下字串的真正結尾的方法。
\G
通常僅與 /g
修飾詞結合使用。如果使用 /g
修飾詞,且比對是在純量內容中進行,Perl 會記住來源字串中上次比對結束的位置,下次比對時,會從上次結束的位置開始。
\G
與該字串上上次比對結束的位置相符,或如果沒有上次比對,則與該字串的開頭相符。
助記符:Global(全域)。
\b{...}
從 v5.22 開始提供,根據大括弧內指定的邊界類型,與邊界相符(兩個字元之間,或在字串的第一個字元之前,或在字串的最後一個字元之後)。邊界類型在下方幾段落中說明。\B{...}
與字元之間的任何位置相符,其中相同類型的 \b{...}
沒有相符。
\b
在沒有緊接 "{"
時,在所有 Perl 中都可用。它與字詞(由 \w
相符)和非字詞字元(\W
)之間的任何位置相符;\b
在沒有緊接 "{"
時,與字元之間的任何位置相符,其中 \b
沒有相符。若要獲得自然語言文字的更佳字詞比對,請參閱下方 "\b{wb}"
。
\b
和 \B
假設在來源字串的開頭和結尾之前有一個非字詞字元;因此,如果來源字串以字詞字元開頭(或結尾),\b
會與來源字串的開頭(或結尾)相符。否則,\B
會相符。
不要使用類似 \b=head\d\b
的內容,並預期它會與行的開頭相符。它無法相符,因為在非字詞 "=" 之前要有一個邊界,必須緊接一個字詞字元。所有純粹的 \b
和 \B
邊界判定僅尋找字詞字元,不尋找非字詞字元或字串結尾。透過將 \b
和 \B
等同於以下內容,可能會有助於了解它們如何運作
\b really means (?:(?<=\w)(?!\w)|(?<!\w)(?=\w))
\B really means (?:(?<=\w)(?=\w)|(?<!\w)(?!\w))
相反地,\b{...}
和 \B{...}
可能會或可能不會與行的開頭和結尾相符,這取決於邊界類型。它們實作 Unicode 預設邊界,在 https://www.unicode.org/reports/tr14/ 和 https://www.unicode.org/reports/tr29/ 中指定。邊界類型如下
\b{gcb}
或 \b{g}
這與 Unicode「字形叢集邊界」相符。(實際上,Perl 始終使用改良的「延伸」字形叢集)。這些在下方 "\X"
中說明。事實上,\X
是獲得相同功能的另一種方法。它等同於 /.+?\b{gcb}/
。使用最適合您情況的方法。
\b{lb}
這會根據預設的 Unicode 換行演算法進行比對 (https://www.unicode.org/reports/tr14/),並根據該文件 (第 35 版範例 7) 中的客製化設定,以更妥善處理數字表達式。
這適用於許多目的,但 CPAN 中提供了一個 Unicode::LineBreak 模組,提供更多功能,包括客製化設定。
\b{sb}
這會比對 Unicode 的「句子邊界」。這有助於剖析自然語言句子。它會提供良好但不完美的結果。例如,它會認為「Mr. Smith」是兩個句子。更多詳細資料請參閱 https://www.unicode.org/reports/tr29/。另外請注意,它會認為任何符合 "\R" (換行符號和垂直定位標籤除外) 的項目都是句子邊界。\b{sb}
可用於為文字處理器設計的文字,這些文字處理器會自動換行以顯示,但硬編碼的換行符號基本上會被視為文字區塊 (實際上是段落) 的結尾,因此也是句子的結尾。\b{sb}
無法妥善處理包含內嵌換行符號的文字,例如您正在閱讀的文件的原始文字。此類文字需要先經過前處理,移除換行符號,才能尋找句子邊界。有些人認為這是 Unicode 標準中的錯誤,而且這種行為在未來的 Perl 版本中可能會有所變更。
\b{wb}
這會比對 Unicode 的「字元邊界」,但會根據 Perl 的預期進行調整。這會提供比純粹的 \b
(不含大括弧) 更好的 (但並非完美的) 自然語言處理結果。例如,它會理解撇號可以出現在字詞中間,而括號則不行 (請參閱以下範例)。更多詳細資料請參閱 https://www.unicode.org/reports/tr29/。
Unicode 目前對字元邊界的定義是比對每一個空白字元之間。Perl 從 5.24 版開始調整這一點,通常不會中斷空白字元的範圍,就像純粹的 \b
一直以來的運作方式一樣。這讓 \b{wb}
可以直接取代 \b
,但通常會提供更好的自然語言處理結果。(這個調整的例外情況是,當空白字元的範圍緊接著像是 U+0303 的組合符號波浪符號時。如果範圍中最後一個空白字元是水平空白字元,它會被拆分出來,並附加到組合符號上。更精確地說,如果以水平空白字元結束的空白字元範圍緊接著的字元具有任何「延伸」、「格式」或「零寬連接符號」的字元邊界屬性值,則最後一個水平空白字元與範圍其他部分之間的邊界會符合 \b{wb}
。在所有其他情況下,兩個空白字元之間的邊界會符合 \B{wb}
。)
當您使用這些 Unicode 邊界時,了解您正在冒著風險,因為包含 Unicode 標準後續版本的 Perl 未來版本將無法與您的程式碼撰寫時完全相同的方式運作。這些規則不被視為穩定,而且比標準的其他部分更容易變更。Unicode 保留隨時變更的權利,而 Perl 保留更新其實作以符合 Unicode 新規則的權利。過去,有些變更是因為已將具有不同於所有先前字元特性的新字元新增至標準,因此制定了新的規則來處理它們。這些變更不應造成任何向後相容性問題。但有些變更已變更現有字元的處理方式,因為 Unicode 技術委員會已決定無論出於何種原因,該變更都是有必要的。這可能是為了修正錯誤,或因為他們認為新的規則會獲得更好的結果。
了解這些是預設邊界定義,以及實作可能會希望針對特定目的和區域設定調整結果也很重要。例如,日文和泰文等一些語言需要字典查詢才能準確地判斷字詞邊界。
助記符:boundary(邊界)。
"cat" =~ /\Acat/; # Match.
"cat" =~ /cat\Z/; # Match.
"cat\n" =~ /cat\Z/; # Match.
"cat\n" =~ /cat\z/; # No match.
"cat" =~ /\bcat\b/; # Matches.
"cats" =~ /\bcat\b/; # No match.
"cat" =~ /\bcat\B/; # No match.
"cats" =~ /\bcat\B/; # Match.
while ("cat dog" =~ /(\w+)/g) {
print $1; # Prints 'catdog'
}
while ("cat dog" =~ /\G(\w+)/g) {
print $1; # Prints 'cat'
}
my $s = "He said, \"Is pi 3.14? (I'm not sure).\"";
print join("|", $s =~ m/ ( .+? \b ) /xg), "\n";
print join("|", $s =~ m/ ( .+? \b{wb} ) /xg), "\n";
prints
He| |said|, "|Is| |pi| |3|.|14|? (|I|'|m| |not| |sure
He| |said|,| |"|Is| |pi| |3.14|?| |(|I'm| |not| |sure|)|.|"
我們在此記錄不屬於上述類別的斜線反斜線序列。這些是
這出現在 perl 5.10.0 中。\K
左側匹配的任何內容都不會包含在 $&
中,而且如果在替換中使用該樣式,則不會被替換。這讓您可以撰寫 s/PAT1 \K PAT2/REPL/x
,而不是 s/(PAT1) PAT2/${1}REPL/x
或 s/(?<=PAT1) PAT2/REPL/x
。
助記符:Keep(保留)。
此功能從 v5.12 開始提供,它會匹配不是換行符號的任何字元。它是撰寫 [^\n]
的簡寫,而且與 .
元符號相同,但 /s
旗標除外,該旗標會變更 .
的意義,但不會變更 \N
。
請注意,\N{...}
可能表示 命名或編號字元。
助記符:\n 的補數。
\R
會匹配一般換行符號;也就是 Unicode 視為換行符號序列的任何內容。這包括 \v
(垂直空白)匹配的所有字元,以及多字元序列 "\x0D\x0A"
(換行符號後接換行字元,有時稱為網路換行符號;這是以二進位模式開啟的 Microsoft 文字檔中使用的結尾序列)。\R
等於 (?>\x0D\x0A|\v)
。(它不會回溯的原因是該序列被視為不可分。這表示
"\x0D\x0A" =~ /^\R\x0A$/ # No match
失敗,因為 \R
符合整個字串,而且不會回溯來符合 "\x0D"
。)由於 \R
可以符合多於一個字元的順序,因此不能放在括號字元類別中;/[\R]/
是錯誤的;改用 \v
。\R
是在 perl 5.10.0 中引入的。
請注意,這不會尊重任何可能生效的區域設定;它會根據平台的原生字元集來符合。
助記符:沒有真正的。選擇 \R
,是因為 PCRE 已經使用 \R
,更重要的是,因為 Unicode 建議這樣的正規表示法元字元,並建議 \R
作為其符號。
這符合 Unicode 延伸音節群集。
\X
很好地符合一般(非 Unicode 程式設計師)用法所認為的單一字元。例如,考慮一個帶有某種附加符號的 G,例如箭頭。在 Unicode 中沒有這樣的單一字元,但可以使用 G 後接 Unicode「組合向上箭頭下方」來組成一個,並且會由 Unicode 感知軟體顯示為單一字元。
符合是貪婪且不回溯的,因此群集永遠不會分解成更小的組成部分。
另請參閱 \b{gcb}
。
助記符:eXtended Unicode 字元。
$str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'
$str =~ s/(.)\K\g1//g; # Delete duplicated characters.
"\n" =~ /^\R$/; # Match, \n is a generic newline.
"\r" =~ /^\R$/; # Match, \r is a generic newline.
"\r\n" =~ /^\R$/; # Match, \r\n is a generic newline.
"P\x{307}" =~ /^\X$/ # \X matches a P with a dot above.