内容

名称

perlrebackslash - Perl 正则表达式反斜杠序列和转义

描述

有关 Perl 正则表达式的顶级文档可在 perlre 中找到。

本文档描述了所有反斜杠和转义序列。在解释反斜杠的作用之后,它列出了 Perl 正则表达式中具有特殊含义的所有序列(按字母顺序排列),然后描述了每个序列。

大多数序列在不同的文档中都有详细描述;本文档的主要目的是提供一个快速参考指南,描述所有反斜杠和转义序列。

反斜杠

在正则表达式中,反斜杠可以执行两种任务之一:它要么消除紧随其后的字符的特殊含义(例如,\| 匹配一个竖线,它不是一个交替),要么是反斜杠或转义序列的开始。

确定它是哪一种的规则非常简单:如果反斜杠后面的字符是 ASCII 标点符号(非单词)字符(即任何不是字母、数字或下划线的字符),那么反斜杠只是消除紧随其后的字符的任何特殊含义。

如果反斜杠后面的字符是 ASCII 字母或 ASCII 数字,则该序列可能是特殊的;如果是,则列在下面。一些字母尚未使用,因此用反斜杠转义它们不会将它们更改为特殊字符。Perl 的未来版本可能会为它们分配特殊含义,因此,如果您启用了警告,Perl 会在您使用此类序列时发出警告。[1]。

但是,保证反斜杠或转义序列后面永远不会有标点符号字符,现在没有,将来 Perl 5 的版本中也没有。因此,在非单词字符前面放置反斜杠是安全的。

请注意,反斜杠本身是特殊的;如果您想匹配反斜杠,您必须用反斜杠转义反斜杠:/\\/ 匹配单个反斜杠。

[1]

有一个例外。如果您使用字母数字字符作为模式的定界符(出于可读性原因,您可能不应该这样做),则如果要匹配它,则必须转义定界符。Perl 不会发出警告。另请参阅 "perlop 中的解析引号构造的详细说明"

所有序列和转义

那些不能在方括号字符类(如 [\da-z])中使用的标记为 不在 [] 中。

\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
[1]

\b 仅在字符类内部是退格符。在字符类之外,\b 本身是单词字符/非单词字符边界,而 \b{} 是其他类型的边界。

[2]

\n 匹配逻辑换行符。Perl 在从文本文件读取或写入文本文件时,在 \n 和您的操作系统的本机换行符之间进行转换。

示例

$str =~ /\t/;   # Matches if $str contains a (horizontal) tab.

控制字符

\c 用于表示控制字符;\c 后面的字符决定构造的值。例如,\cA 的值为 chr(1)\cb 的值为 chr(2),等等。详细说明请参阅 "perlop 中的正则表达式引号类运算符"chr(1) 等对于 ASCII 和 EBCDIC 平台的完整列表,请参阅 "perlebcdic 中的运算符差异"

请注意,\c\ 独自位于正则表达式(或双引号字符串)的末尾是无效的。反斜杠后面必须跟另一个字符。也就是说,对于所有字符 X\c\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+code point}` 形式,其中 code point 是一个十六进制数,表示 Unicode 分配给所需字符的代码点。习惯上(但不是必需的)使用前导零将数字填充到 4 位。因此 `\N{U+0041}` 表示 `LATIN CAPITAL LETTER A`,您很少会看到它没有两个前导零。`\N{U+0041}` 在 EBCDIC 机器上也表示“A”(其中“A”的序数值不是 0x41)。

空格可以自由地插入到包含名称或代码点的花括号的相邻位置,但在花括号内。因此 \N{ U+0041 } 是完全合法的。

甚至可以通过使用 charnames 模块为字符和字符序列指定您自己的名称。这些自定义名称在词法上是作用域的,因此给定代码点在不同作用域中可能具有不同的名称。使用的名称是在扩展 `\N{}` 时生效的名称。对于双引号上下文中的模式,这意味着在解析模式时。但对于由单引号分隔的模式,扩展将推迟到模式编译时,此时可能会有不同的 `charnames` 翻译器生效。

(有一个扩展的内部形式,您可能会在调试输出中看到:\N{U+code point.code point...}... 表示任意数量的这些 code point,用点隔开。这表示由字符形成的序列。这只是一个内部形式,可能会发生变化,您不应该尝试自己使用它。)

助记符:Named character。

请注意,以命名或编号字符表示的字符或字符序列被正则表达式引擎视为没有特殊含义的字符,并将“按原样”匹配。

示例

$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 之前的代码点是安全的。

助记符:0ctal 或 octal。

示例(假设 ASCII 平台)

$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 使用以下规则来消除歧义

  1. 如果反斜杠后跟一个数字,则它是反向引用。

  2. 如果反斜杠后的第一个数字是 0,则它是八进制转义。

  3. 如果反斜杠后的数字是 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开头。后面紧跟着要么是正好两个十六进制数字形成的数字,要么是被花括号包围的任意长度的十六进制数字。十六进制数字是您要表达的字符的代码点。

请注意,用这些转义符之一表示的字符被正则表达式引擎视为没有特殊含义的字符,并将“按原样”匹配。

助记符:十六进制。

示例(假设为 ASCII 平台)

$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 将使后面的字符大写(或更准确地说,首字母大写)。它们提供的功能类似于 lcfirstucfirst 函数。

要将多个字符大写或小写,可以使用 \L\U,它们将使后面的所有字符小写/大写,直到模式结束或下一个 \E 出现,以先发生者为准。它们提供的功能类似于 lcuc 函数提供的功能。

\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(垂直)。

Unicode 类

\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{name}(从 Perl 5.10.0 开始)可用于反向引用命名捕获组,完全无需考虑捕获缓冲区位置。

为了与 .Net 正则表达式兼容,\g{name} 也可以写成 \k{name}\k<name>\k'name'

为了避免任何歧义,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

\A 仅匹配字符串的开头。如果未使用 /m 修饰符,则 /\A/ 等效于 /^/。但是,如果使用了 /m 修饰符,则 /^/ 匹配内部换行符,但 /\A/ 的含义不会因 /m 修饰符而改变。无论是否使用 /m 修饰符,\A 都匹配字符串的开头。

\z, \Z

\z\Z 匹配字符串的结尾。如果未使用 /m 修饰符,则 /\Z/ 等效于 /$/;也就是说,它匹配字符串的结尾,或者匹配字符串结尾处的换行符之前的字符。如果使用了 /m 修饰符,则 /$/ 匹配内部换行符,但 /\Z/ 的含义不会因 /m 修饰符而改变。无论是否使用 /m 修饰符,\Z 都匹配字符串的结尾(或匹配尾随换行符之前的字符)。

\z\Z 相似,区别在于它不会匹配尾随换行符之前的字符。\z 仅在字符串末尾匹配,无论使用什么修饰符,而不仅仅是在换行符之前匹配。它是在所有情况下将匹配锚定到字符串真实末尾的方法。

\G

\G 通常仅与 /g 修饰符结合使用。如果使用 /g 修饰符并在标量上下文中进行匹配,Perl 会记住上次匹配在源字符串中的结束位置,并在下次匹配时从上次结束的位置开始匹配。

\G 匹配上一次在该字符串上的匹配结束的位置,或者如果之前没有匹配,则匹配该字符串的开头。

助记符:Global(全局)。

\b{}, \b, \B{}, \B

\b{...}(从 v5.22 开始可用)根据花括号内指定的边界类型,匹配 Unicode 规则定义的边界(两个字符之间,或字符串第一个字符之前,或字符串最后一个字符之后)。边界类型将在下面几段中给出。\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) 中进行了自定义,以更好地处理数字表达式。

这适用于许多目的,但 Unicode::LineBreak 模块在 CPAN 上可用,它提供了更多功能,包括自定义。

\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 对词边界(Word Boundary)的定义是在每个空白字符之间匹配。从 Perl 5.24 版本开始,Perl 对此进行了调整,通常不会将空白字符的跨度拆开,就像普通的 `\b` 一直以来的功能一样。这使得 `\b{wb}` 可以作为 `\b` 的直接替换,但对于自然语言处理来说通常会得到更好的结果。(这种调整的例外情况是,当一个空白字符的跨度紧跟着像 U+0303 这样的组合波浪号(COMBINING TILDE)时。如果跨度中的最后一个空格字符是水平空格,它会被拆分出来,以便它与组合字符相连。更准确地说,如果以水平空格结尾的空白字符跨度,其紧随其后的字符具有任何“扩展”(Extend)、“格式”(Format)或“零宽度连接符”(ZWJ)的词边界属性值,则最后一个水平空格字符与跨度其余部分之间的边界与 `\b{wb}` 相匹配。在所有其他情况下,两个空白字符之间的边界与 `\B{wb}` 相匹配。)

重要的是要意识到,当你使用这些 Unicode 边界时,你是在冒着风险,因为 Perl 的未来版本可能包含 Unicode 标准的更高版本,其工作方式可能与你编写代码时的工作方式不完全相同。这些规则不被认为是稳定的,并且比标准的其余部分更容易发生变化。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|)|.|"

杂项

这里我们记录了不属于上述任何类别的反斜杠序列。这些是

\K

这出现在 perl 5.10.0 中。\K 左侧匹配的任何内容都不会包含在 $& 中,如果模式用于替换,也不会被替换。这允许您编写 s/PAT1 \K PAT2/REPL/x 而不是 s/(PAT1) PAT2/${1}REPL/xs/(?<=PAT1) PAT2/REPL/x

助记符:Keep。

\N

此功能从 v5.12 开始可用,匹配任何不是换行符的字符。它是编写 [^\n] 的简写,与 . 元符号相同,除了在 /s 标志下,它改变了 . 的含义,但没有改变 \N 的含义。

请注意,\N{...} 可以表示 命名或编号字符

助记符:\n 的补码。

\R

\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 作为其表示法。

\X

这匹配 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.