我在我的c ++项目中使用pcre2_substitute()
函数来执行正则表达式替换:
int ret=pcre2_substitute(
re, /*Points to the compiled pattern*/
subject, /*Points to the subject string*/
subject_length, /*Length of the subject string*/
0, /*Offset in the subject at which to start matching*/
rplopts, /*Option bits*/
0, /*Points to a match data block, or is NULL*/
0, /*Points to a match context, or is NULL*/
replace, /*Points to the replacement string*/
replace_length, /*Length of the replacement string*/
output, /*Points to the output buffer*/
&outlengthptr /*Points to the length of the output buffer*/
);
This is the man page of the function。它并没有说明有多少被捕获的群体是可能的。我测试过$01
,${6}
,$12
有效,但限制是什么?
我检查了C ++ std::regex
是否有数字限制,但是没有。 $000000000000001
$1
std::regex
$00
{{1}}表示{{1}},其余部分将被视为字符串。
答案 0 :(得分:3)
最大捕获组数 65,535 。这也是可以在模式或替换中反向引用的最大组编号。
但是,一般来说,在允许大量群组之前匹配可能会达到另一个限制:例如主题字符串的最大长度,或内部调用match()
的次数(总计或递归),但可以增加匹配限制。有关匹配限制的详细信息,请参阅 The match context 中的“pcre2api”。
括号内的子模式数量没有限制, 但是不能超过65,535个捕获子模式。
但是,括号的嵌套深度有限制 各种子模式。这是为了限制金额 编译时使用的系统堆栈。 PCRE2可以指定限制 建成;默认值为250。
和
命名子图案的最大数量为10,000。
Philip Hazel。最后更新时间:2014年11月25日。 - *截至PCRE2版本10.20
PCRE和PCRE2具有相同的限制:
重复量词的所有值均限制为65,535。
无限数量的带括号的子图案
(尽管它仅限于各种带括号的子模式的嵌套深度)。
65,535 捕获子图案。
10,000 名为子图案。
嵌套括号的默认最大深度为250
(PCRE2_CONFIG_PARENSLIMIT
)的值。
命名子模式的名称的最大长度为32个代码单位 char由1+ code units表示(取决于编码)。例如。在UTF-8中,“Ç”有2个代码单元:0xC3 0x87
向后引用的数量没有限制。
后续子模式前向引用的数量限制约为200,000。
控制谓词中使用的名称限制为255(8位)和65,535(16或32位)。
PCRE2_CONFIG_MATCHLIMIT
的默认值为10,000,000(10米)。
PCRE2_CONFIG_RECURSIONLIMIT
的默认值为10,000,000(10米)
(此限制仅适用于设置小于MATCH_LIMIT
的情况。)
如果使用默认内部链接大小2进行编译,已编译模式的最大长度为64K代码单元(有关详细信息,请参阅pcre2build documentation)。
主题字符串的最大长度是整数变量可以容纳的最大正数(可能是~1.8E + 19)。但是,可用的堆栈空间可能会限制可由某些模式处理的主题字符串的大小
主题字符串的最大长度(以代码单位表示)比PCRE2_SIZE
变量可容纳的最大数字小1。 PCRE2_SIZE
是无符号整数类型,通常定义为size_t
。
答案 1 :(得分:2)
用 pcre2-10.20 \ README 编写, PCRE2有一个计数器,用于限制模式中括号的嵌套深度。这限制了模式在编译时使用的系统堆栈数量。默认值为250,但您可以通过设置来更改它,例如--with-parens-nest-limit=500
和 PCRE2有一个计数器,可以设置为限制匹配模式时使用的资源量。如果在匹配期间超出限制,则匹配失败。默认值是一千万。您可以通过设置更改默认值,例如--with-match-limit=500000
。
所以,似乎是反向引用的数量
由于您自己构建了库,因此可以进一步增加库。
大多数正则表达式支持最多 99 捕获组和两位数的反向引用。因此,如果您的正则表达式有99个捕获组,则
\99
是有效的反向引用。
Regular Expression Reference: Capturing Groups and Backreferences page:
反向引用
\1
到\9
反向引用\10
到\99
请注意,“大多数”作者必须指的是主要的正则表达式引擎(PHP,JavaScript,Python,.NET),而POSIX BRE,POSIX ERE,GNU BRE,GNU ERE正则表达式只支持反向引用最多\9
。
但是,在pcre.txt中,有一行。
带有八进制代码ddd或反向引用的
\ddd
字符
因此,根据该文件,可以有999个小组。