锚点

锚点匹配行中长度为零的位置,而不是特定字符。

  • ^⇒ 这匹配一行的开头(除非在集合内使用,见上文)。
  • $ ⇒ 这匹配一行的结尾。
  • \< ⇒ 这匹配使用 Scintilla 的单词定义的单词的开头。
  • \> ⇒ 这匹配使用 Scintilla 的单词定义的单词结尾。
  • \b⇒ 匹配单词的开头或结尾。
  • \B⇒ 不是单词边界。它表示两个单词字符之间或两个非单词字符之间的任何位置。
  • \A\`⇒ 匹配文件的开头。
  • \z\'⇒ 匹配文件的结尾。
  • \Z⇒ 与前面有可选换行符序列\z匹配。这相当于(?=\v*\z),它背离了这种转义的传统 Perl 含义。
  • \G⇒ 这个“Continuation Escape”匹配上一次匹配的结尾。在查找全部或全部替换的情况下,这将允许您在上一次匹配结束时锚定下一次匹配。如果它是Find AllReplace All的第一个匹配项,并且任何时候您使用单个Find NextReplace,“上一个匹配项的结尾”被定义为搜索区域的开始 – 文档的开头,或当前插入符号位置,或突出显示文本的开头。

捕获组和反向引用

  • (subset)编号捕获组:括号标记正则表达式的子集,也称为子集表达式或捕获组。与括号内容匹配的字符串(在本例中由subset表示)可以与反向引用一起重新使用或作为替换操作的一部分;请参阅下面的替换。(捕获)组可以嵌套。
  • (?<name>subset)(?'name'subset)(?(name)subset)`⇒命名捕获组:将subset匹配的值命名为组name。请注意,组名区分大小写。
  • \ℕ\gℕ\g{ℕ}\g<ℕ>\g'ℕ'\kℕ\k{ℕ},\k<ℕ>\k'ℕ'⇒*编号反向引用:*这些语法匹配同一表达式中前面的第 ℕth 个捕获组。(反向引用仅用于在搜索/匹配表达式中引用捕获组内容;请参阅替换转义序列了解如何在替换/替换中引用捕获组。) 一个正则表达式可以有多个子组,因此\2,\3等可用于匹配其他子组(数字随着组的左括号从左到右增加)。您可以根据需要拥有任意数量的捕获组,并且不仅限于 9 个组(尽管某些语法变体只能引用组 1-9;请参阅下面的注释,并使用明确允许多位数字 ℕ 的语法如果您有超过 9 个组)
    • 示例:([Cc][Aa][Ss][Ee]).*\1将匹配诸如Case matches Case但是不匹配Case doesn't match cASE之类的行。
    • \gℕ\g{ℕ}\g<ℕ>\g'ℕ'\kℕ\k{ℕ}\k<ℕ>or \k'ℕ'⇒ 这些形式可以处理任何非零的ℕ。
      • 对于正数 ℕ,它匹配第 ℕth 子组,即使 ℕ 有多位数字。 \g10匹配第 10 个捕获组的内容,而不是第一个捕获组的内容,后跟文字0.
        • 如果要在第 ℕ个捕获组的内容之后匹配文字数字,请使用具有大括号、方括号或引号的形式之一,例如\g{ℕ}\k'ℕ'\k<ℕ>:例如,\g{2}3匹配第二个捕获组的内容,后跟文字 3,而\g23将匹配第 23 个捕获组的内容。
        • 为清楚起见,强烈建议始终使用大括号或方括号形式表示多位ℕ
      • 对于负数 ℕ,组相对于最后一组倒数计数,因此这\g{-1}是最后一个匹配组,并且\g{-2}是倒数第二个匹配组。
        • 请注意绝对和相对反向引用之间的区别。例如,一个精确的四字母单词回文可以匹配:
          • 正则表达式(?-i)\b(\w)(\w)\g{2}\g{1}\b,当使用绝对(正)坐标时
          • 正则表达式(?-i)\b(\w)(\w)\g{-1}\g{-2}\b,当使用相对(负)坐标时
    • \ℕ⇒ 这种形式只适用于 ℕ 是数字 1-9的情形,所以如果你有超过 9 个捕获组,你将不得不使用在下一个要点中列出的其他编号的反向引用表示法之一。 示例:表达式\10匹配第一个捕获组的内容,\1后跟文字字符0而不是第 10 组的内容。
  • \g{name}\g<name>\g'name'\k{name}\k<name>or \k'name'⇒ 命名反向引用:匹配名为name的子表达式的字符串。(与上面的编号反向引用一样,这些命名反向引用仅用于在搜索/匹配表达式中引用捕获组内容;请参阅替换转义序列以了解如何在替换/替换中引用捕获组。)

可读性增强

  • (?:subset)⇒ 子集表达式的分组结构*,*它不计为子表达式(不被编号或命名),但只是为了更容易阅读正则表达式或使用该组的量化数量而对事物进行分组,在该分组构造之后带有量词。
  • (?#comment)⇒注释。整个组仅适用于人类阅读,在匹配文本中将被忽略。

使用 x 标志修饰符(见下文)也是提高复杂正则表达式可读性的好方法。

搜索修饰符

以下构造控制匹配如何决定其他匹配,或以其他方式改变执行搜索的方式。

  • \Q⇒ 启动逐字模式(Perl 称之为“引用”)。在这种模式下,所有字符都按原样处理,唯一的例外是\E结束逐字模式序列。
  • \E⇒ 结束逐字模式。因此,\Q\*+\Ea+匹配\*+aaaa
  • (?enable-disable)(?enable-disable:subpattern)⇒ 有四个标志,如下所述,可应用于正则表达式或子组。启用(enable) 项可以由下面描述的 0-4 个标志组成;禁用(disable) 项可以由下面描述的 0-4 个标志组成。enable*中的任何标志都将被启用(打开);*禁用(disable) 的任何标志都将被禁用(关闭)。(请记住,在启用和禁用条件中包含相同的标志是没有意义的。)如果没有禁用 标志,则-没有必要;如果没有启用 标志,则将-紧跟在?后面:(?-...)。 如果有子模式,那么标志只适用于子模式的内容;没有子模式,就没有:分隔符,并且这些标志适用于当前正则表达式的其余部分,或者直到设置下一个标志。
    • i⇒ 不区分大小写(默认:由☐ 匹配大小写对话框选项设置)
    • m⇒ ^ 和 $ 匹配嵌入的换行符(默认值:打开)
    • s⇒ 点匹配换行符(默认:根据☐ . 匹配换行符对话框选项)
    • x⇒ 忽略正则表达式中的非转义空格(默认值:关闭)。您需要匹配的任何空格都必须转义
    例子:
    • blah(?i-s)foobar⇒ 启用不区分大小写并为正则表达式的其余部分禁用点匹配换行符:因此表达式blah在默认规则下运行(由对话框设置),而表达式foobar将不区分大小写并且点将不匹配换行符。
    • (?i-s:subpattern)⇒ 启用不区分大小写并禁用点匹配换行符,但仅适用于subpattern
    • (?-i)caseSensitive(?i)cAsE inSenSitive⇒ 为由 caseSensitive指示的正则表达式部分禁用不区分大小写(使其区分大小写),并为正则表达式的其余部分重新启用不区分大小写的匹配
    • (?m:justHere)^$将匹配嵌入的换行符,但仅适用于该justHere子组的内容
    • (?x)⇒ 为正则表达式的其余部分在表达式中允许额外的空格
    请注意,关闭“点匹配换行符”(?-s)不会 影响字符类:(?-s)[^x]+将匹配任何非x字符的 1 个或多个实例,包括换行符,即使(?-s) 搜索修饰符关闭“点匹配换行符”([^x]不是点“.”, 所以仍然允许匹配换行符)。
  • (?|expression)⇒ 如果一个替代表达式在它的一些替代中包含括号子表达式,您可能希望子表达式计数器不被替代的其他分支中的内容改变。这个结构就是这样做的。 例如,您获得以下子表达式计数器值: # before ---------------branch-reset----------- after / (?x) ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) # 1 2 2 3 2 3 4 如果没有分支重置,(y)将是第 3组、(p(q)r)是第 4组并且(t)是第 5 组。使用分支重置后,它们都报告为第 2 组。

控制流

通常,正则表达式从左到右线性解析。但是您可能需要更改此行为。

  • |⇒ 替代运算符,允许匹配多个选项中的任何一个。例如,one|two|three将匹配one,twothree。从左到右尝试匹配。用于(?:)匹配此类构造中的空字符串。
  • (?ℕ)⇒ 指第ℕ个子表达式。如果 ℕ 为负数,它将使用末尾的第 ℕ个 子表达式。 请注意子表达式和反向引用之间的区别。例如,使用类似的结构,当搜索作为回文的四字母词时,这一次,两个正则表达式都只找到一个四字母词,因为每个子表达式,无论是否有符号,都引用正则表达式本身,包含在每个组中,而不是每个组的现值!
    • 使用绝对坐标时,正则表达式(?-i)\b(\w)(\w)(?2)(?1)\b找到一个四个字母的单词
    • 使用相对坐标时,正则表达式(?-i)\b(\w)(\w)(?-1)(?-2)\b找到一个四个字母的单词

实际上,这两个正则表达式可以简化为(?-i)\b(\w)(\w)\w\w\b,假设仍然需要第 1 组和第 2 组来替换

  • (?0)(?R)⇒ 回溯到模式的开始。
  • (?&name)(?P>name)⇒ 回溯到名为name的子表达式。
    • 如果无符号子表达式位于它所指的组的括号之外,则称为子例程调用
    • 如果无符号子表达式位于它所引用的组的括号内,则称为递归调用
  • (?(assertion)YesPattern|NoPattern)⇒ 条件表达式 如果断言为真,则YesPattern将用于匹配文本;如果断言为假,则NoPattern将用于匹配文本。 YesPatternNoPattern是任何有效的正则表达式模式。 断言总是在括号内;通过在如下所示列表中支持的断言语法包含括号来强调这一点,
    • (ℕ)⇒ 如果之前定义了第 ℕ个未命名组,则为 true
    • (<name>)('name')⇒ 如果之前定义了名为name的组,则为 true
    • (?=lookahead)⇒ 如果先行断言表达式匹配则为 true
    • (?!lookahead)⇒ 如果先行断言表达式不匹配,则为 true
    • (?<=lookbehind)⇒ 如果后行断言表达式匹配则为 true
    • (?<!lookbehind)⇒ 如果后行断言表达式不匹配,则为 true
    • (R)⇒ 如果在递归内则为 true
    • (Rℕ)⇒ 如果递归到子表达式编号为 ℕ,则为 true
    • (R&name)⇒ 如果递归到名为name的命名子表达式时为 true

注意:这些都还位于条件表达式中之内

不要将控制条件表达式的断言(此处)与作为模式匹配一​​部分的断言(见下文的断言部分)混淆。这里,如果使用断言来决定使用哪个表达式;下面,断言决定模式是否匹配。

注意:PCRE 不像 Perl 那样处理递归表达式:

在 PCRE(与 Python 类似,但与 Perl 不同)中,递归子模式调用始终被视为原子组。也就是说,一旦它匹配了一些主题字符串,它就永远不会重新输入,即使它包含未尝试的替代项并且随后出现匹配失败。

  • (?>pattern)⇒ 独立子表达式 匹配*模式(pattern)*独立于周围的模式。搜索永远不会回溯到独立的子表达式。 独立子表达式通常用于提高性能,因为只会考虑模式的最佳匹配;如果这不允许整个表达式匹配,则根本找不到匹配项。 它还可以用于保持条件表达式(上文)的逻辑正确,防止意外地使用错误的替代路径。例如,当使用组号作为条件断言时,(?(ℕ)YesPattern|NoPattern)
    • 正则表达式(?:(100)|\d{3}) apples (?(1)YesPattern|NoPattern)不使用独立的子表达式,因此它会找到100 apples NoPattern,即使您希望在100匹配时使用YesPattern。为什么会这样?如果YesPattern失败,搜索将回溯到开头并尝试下一个替代方案,其中100匹配\d{3},但这意味着?(1)不匹配,因此条件表达式使用NoPattern
    • 相反,您可以通过使用 正则表达式 (?>(100)|\d{3}) apples (?(1)YesPattern|NoPattern)来使用独立的子表达式防止回溯。现在,如果YesPattern失败,它不能回溯使用\d{3},从而防止它意外使用100 apples NoPattern,因此100它要么匹配100 apples YesPattern要么整个表达式将失败。
  • \K⇒ 在此处重置匹配的文本。例如,匹配foo\Kbar将不匹配bar。它会匹配foobar,但会假装只bar匹配。当您只想替换匹配主题的尾部并且组难以制定时很有用。 如果您需要一个包含非固定长度模式的后向断言(参见下文),它也很有用。由于 Boost 的正则表达式中不允许使用可变长度的lookbehind,因此您可以改用该\K语法。例如,不允许的语法(?-i)(?<=\d+)abc可以用正确语法(?-i)\d+\Kabc替换,用来匹配前面至少有一个数字的确切字符串abc

断言

这些特殊的组不消耗字符。他们成功的匹配很重要,但是当他们完成后,匹配从它离开的地方开始。

  • (?=pattern)⇒ 肯定 lookahead:如果模式(pattern) 匹配,则回溯到模式(pattern) 的开头。这允许使用逻辑 AND 来组合正则表达式。
    • 该表达式(?=.*[[:lower:]])(?=.*[[:upper:]]).{6,}尝试在任何地方查找小写字母。成功后,它会回溯并搜索大写字母。再一次成功时,它会检查主题是否至少有 6 个字符。
    • q(?=u)i不匹配quit,因为断言(?=u)匹配 u但不消耗u,因为匹配u消耗零个字符,因此尝试在模式中匹配i会失败,因为它仍在与正在搜索的文本中的u进行比较。
  • (?!pattern)⇒ 否定 lookahead:如果前瞻模式不匹配,则匹配。
  • (?<=pattern)⇒ positive lookbehind:如果模式(pattern) 在搜索中的当前位置之前立即匹配,则此断言匹配。
  • (?<!pattern)⇒negative lookbehind:如果模式(pattern) 在搜索中的当前位置之前不匹配,则此断言匹配。
    • 注意:在后向断言中,模式(pattern) 必须是固定长度,以便正则表达式引擎知道在哪里测试断言。可变长度后视的类似结构包括:
      • 对于来自一组有限的常量数据项的可变长度后向断言,诸如此类的构造((?<=short)|(?<=longer))是可行的。单独的 lookbehinds 仍然不能包含+*类似的可变长度语法。
      • 如果您想要的后视比这更复杂,您可以使用\K(见上文):使用a.*b\KMATCH而不是(?<=a.*b)MATCH,这不起作用。仅当所需的lookbehind 是匹配的第一部分时,此\K解决方法才有效,因为在\K之前的所有内容都被排除在最终匹配外。
最后修改日期: 1 12 月, 2022

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。