正则表达式语法速查¶
这份清单总结了最常用/最难记住的正则表达式引擎部件,这些部件可在Calibre的大多数部件中使用。
字符种类¶
字符集合可以用来简洁地表示不同的字符组合。
例如:
表达式 |
种类 |
|
小写字母,不包括带重音符号的字母和连字字母 |
|
a 到 z 的小写字母或 0 到 9 的数字 |
|
大写和小写字母,或短横“-”。要在集合中包括短横,必须把它放在开头或结尾,从而不会和指定字符范围的短横混淆。 |
|
除数字之外的任何字符。 位于类开头的插入符号 (^) 排除该类的字符(补集类) |
|
小写元音字母。字符集合可以包含另一个字符集合。 |
|
所有字母(包括带重音符号的外语字母)。 可以在类内部使用缩写类 |
例如:
<[^<>]+> to select an HTML tag
缩写字符集合¶
表达式 |
种类 |
|
一个数字( 与``[0-9]``相同) |
|
任何非数字字符(与 ``[^0-9]``相同) |
|
一种字母数字字符( |
|
任何“非单词”字符 |
|
空格、不间断空格、制表符、返回行 |
|
任何“非空白”字符 |
|
除换行符以外的任何字符。使用“.all”复选框或``(?s)``正则表达式修饰符来包含换行符。 |
量词¶
量词 |
量词前表达式出现次数 |
|
表达式出现0或1次。与``{0,1}``相同 |
|
表达式出现1次或多次。与``{1,}``相同 |
|
表达式出现0次、1次或更多次。与``{0,}``相同 |
|
该表达式恰好出现n次 |
|
包含的最小值和最大值之间的出现次数 |
|
包含的最小值和无穷大之间的出现次数 |
|
介于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 |
|
递归匹配整个模式 |
|
编号捕获组的唯一模式的递归,此处为组1 |
递归是在召唤自己。这对于平衡查询非常有用,例如可以包含嵌入的带引号的字符串的引号字符串。因此,如果在处理双引号之间的字符串的过程中,我们遇到双引号之间的新字符串的开头,那么我们知道如何做,我们称之为自己。然后我们就有了类似这样的模式:
start-pattern(?>atomic sub-pattern|(?R))*end-pattern
要在双引号之间选择字符串而不在嵌入的字符串上停止,请执行以下操作:
“((?>[^“”]+|(?R))*[^“”]+)”
该模板还可用于修改可嵌入的标签对,例如“<div>”标签。
特殊字符¶
表达式 |
字符 |
|
tabulation |
|
换行符 |
|
(可间断的)空格 |
|
不间断空格 |
元字符¶
元字符是那些对正则表达式引擎具有特殊意义的字符。其中,十二必须在前加一个转义符,即反斜杠(\
),才能失去其特殊含义,重新成为正则字符:
^ . [ ] $ ( ) * + ? | \
其他七个元字符不需要以反斜杠开头(但可以没有任何其他后果):
{ } ! < > = :
如果在类中使用特殊字符(位于括号``[]``之间),它们将失去状态。括号和短划线在类中具有特殊的地位。在类之外,短划线是一个简单的文字,右括号仍然是一个元字符。
斜杠(/)和数字符号(或哈希字符)(#)不是元字符,它们不需要转义。
在一些工具中,如带有Python引擎的regex101.com,双引号具有分隔符的特殊状态,必须转义,或者更改选项。优秀编辑的情况并非如此。
Modes¶
(?s)
使点 (
.
) 也匹配换行符(?m)
使“^”和“$”锚与行的开始和结束匹配,而不是与整个字符串的开始和结尾匹配。