正则表达式语法速查

这份清单总结了最常用/最难记住的正则表达式引擎部件,这些部件可在Calibre的大多数部件中使用。

字符种类

字符集合可以用来简洁地表示不同的字符组合。

例如:

表达式

种类

[a-z]

小写字母,不包括带重音符号的字母和连字字母

[a-z0-9]

a 到 z 的小写字母或 0 到 9 的数字

[A-Za-z-]

大写和小写字母,或短横“-”。要在集合中包括短横,必须把它放在开头或结尾,从而不会和指定字符范围的短横混淆。

[^0-9]

除数字之外的任何字符。 位于类开头的插入符号 (^) 排除该类的字符(补集类)

[[a-z]--[aeiouy]]

小写元音字母。字符集合可以包含另一个字符集合。-- 符号表示排除它之后的集合

[\w--[\d_]]

所有字母(包括带重音符号的外语字母)。 可以在类内部使用缩写类

例如:

<[^<>]+> to select an HTML tag

缩写字符集合

表达式

种类

\d

一个数字( 与``[0-9]``相同)

\D

任何非数字字符(与 ``[^0-9]``相同)

\w

一种字母数字字符([a-zA-Z0-9]`),包括带重音符号和连字的字符

\W

任何“非单词”字符

\s

空格、不间断空格、制表符、返回行

\S

任何“非空白”字符

.

除换行符以外的任何字符。使用“.all”复选框或``(?s)``正则表达式修饰符来包含换行符。

量词

量词

量词前表达式出现次数

?

表达式出现0或1次。与``{0,1}``相同

+

表达式出现1次或多次。与``{1,}``相同

*

表达式出现0次、1次或更多次。与``{0,}``相同

{n}

该表达式恰好出现n次

{min,max}

包含的最小值和最大值之间的出现次数

{min,}

包含的最小值和无穷大之间的出现次数

{,max}

介于0和包含的最大值之间的出现次数

贪婪

默认情况下,对于量词,正则表达式引擎是贪婪的:它尽可能多地扩展选择。起初,这往往会引起意外。“?”跟随一个量词使其变懒。避免将两者放在同一个表达式中,结果可能是不可预测的。

小心嵌套的量词,例如模式“(a*)*”,因为它会成倍地增加处理时间。

交替

正则表达式中的“|”字符是逻辑“OR”。这意味着前面的表达式或下面的表达式都可以匹配。

不包括在内

方法 1

pattern_to_exclude(*SKIP)(*FAIL)|pattern_to_select

例如:

"Blabla"(*SKIP)(*FAIL)|Blabla

选择Blabla,在字符串Blabla或“Blabla or Blabla”中,但不在“Blabla”中。

方法 2

pattern_to_exclude\K|(pattern_to_select)

"Blabla"\K|(Blabla)

选择Blabla,在字符串Blabla或“Blabla or Blabla”中,但不在“Blabla”中。

锚点是匹配字符串中的逻辑位置而不是字符的一种方式。文本处理中最有用的锚点是:

\b

指定单词边界,即从空格字符到非空格字符的转换。例如,您可以使用“bssurd”来匹配“the surd”,但不能使用“荒谬”。

^

匹配行首(在多行模式下,这是默认设置)

$

匹配行尾(在多行模式下,这是默认设置)

\K

将所选内容的起始位置重置为其在阵列中的位置。一些正则表达式引擎(但不是calibre)不允许可变长度的lookbacking,尤其是使用量词。当您可以将“K”与这些引擎一起使用时,它还允许您通过编写可变长度的正查找表来消除这一限制。

(表达式)

捕获组,它存储所选内容,并可稍后在*搜索*或*替换*模式中用“n”调用,其中“n”是捕获组的序列号(按读取顺序从1开始)

(?:表达式)

未捕获所选内容的组

(?>表达式)

Atomic Group:一旦满足表达式,正则表达式引擎就会通过,如果模式的其余部分失败,它将不会回溯以尝试与表达式的其他组合。原子组不会捕获。

(?|表达式)

分支重置组:表达式中包含的替换项的分支共享相同的组号

(?<name>表达式)

名为“name”的组。稍后可以在*search*模式中用“(?P=name)”和在*replace*中用“g <name>”调用所选内容。两个不同的组可以使用相同的名称。

Lookarounds

Lookaround

Meaning

?=

正向前视(放置在选定内容之后)

?!

反向前视(放在选择之后)

?<=

正向后视(放在所选内容之前)

?<!

反向后视(放在选定内容之前)

Lookahead和lookbehinds不消耗字符,它们为零长度,不捕获。它们是原子组:只要断言得到满足,正则表达式引擎就会通过,如果模式的其余部分失败,它就不会在环视中回溯以尝试其他组合。

在字符串中查找多个匹配时,在每次匹配尝试的起始位置,后行断言可以检查当前位置之前的字符。因此,在字符串123上,模式“(?<=d)d”(一个数字前面有一个数字)理论上应该选择2和3。另一方面,“dKd”只能选择2,因为第一次选择后的起始位置正好在3之前,并且没有足够的数字进行第二次匹配。类似地,“d(d)”只捕获2。在calibre的regexp引擎实践中,正向后行断言的行为与理论相反,只选择2。

组可以放置在环视区内,但捕获很少有用。然而,如果它是有用的,那么在后行断言中使用量词时就必须非常小心:与没有后行断言相关的贪婪可能会带来令人惊讶的结果。出于这个原因,当你在一个正向后行断言的捕获组中有一个量词(或者更糟的是,几个)时,使用“K”而不是正向后行断言。

负向先行断言示例:

(?![^<>{}]*[>}])

放置在图案末尾可防止在文件中嵌入的 标记或样式中进行选择。

只要可能,最好“固定”环视,以减少获得结果所需的步骤数。

Recursion

表达式

Meaning

(?R)

递归匹配整个模式

(?1)

编号捕获组的唯一模式的递归,此处为组1

递归是在召唤自己。这对于平衡查询非常有用,例如可以包含嵌入的带引号的字符串的引号字符串。因此,如果在处理双引号之间的字符串的过程中,我们遇到双引号之间的新字符串的开头,那么我们知道如何做,我们称之为自己。然后我们就有了类似这样的模式:

start-pattern(?>atomic sub-pattern|(?R))*end-pattern

要在双引号之间选择字符串而不在嵌入的字符串上停止,请执行以下操作:

“((?>[^“”]+|(?R))*[^“”]+)”

该模板还可用于修改可嵌入的标签对,例如“<div>”标签。

特殊字符

表达式

字符

\t

tabulation

\n

换行符

\x20

(可间断的)空格

\xa0

不间断空格

元字符

元字符是那些对正则表达式引擎具有特殊意义的字符。其中,十二必须在前加一个转义符,即反斜杠(\),才能失去其特殊含义,重新成为正则字符:

^ . [ ] $ ( ) * + ? | \

其他七个元字符不需要以反斜杠开头(但可以没有任何其他后果):

{ } ! < > = :

如果在类中使用特殊字符(位于括号``[]``之间),它们将失去状态。括号和短划线在类中具有特殊的地位。在类之外,短划线是一个简单的文字,右括号仍然是一个元字符。

斜杠(/)和数字符号(或哈希字符)(#)不是元字符,它们不需要转义。

在一些工具中,如带有Python引擎的regex101.com,双引号具有分隔符的特殊状态,必须转义,或者更改选项。优秀编辑的情况并非如此。

Modes

(?s)

使点 (.) 也匹配换行符

(?m)

使“^”和“$”锚与行的开始和结束匹配,而不是与整个字符串的开始和结尾匹配。