pcre2_substitute()函数支持多少个捕获的组?

时间:2015-11-25 17:46:19

标签: c++ regex pcre

我在我的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}},其余部分将被视为字符串。

我用于测试的代码是this one。 您需要pcre2库才能运行此代码。

2 个答案:

答案 0 :(得分:3)

最大捕获组数 65,535 。这也是可以在模式或替换中反向引用的最大组编号。

但是,一般来说,在允许大量群组之前匹配可能会达到另一个限制:例如主题字符串的最大长度,或内部调用match()的次数(总计或递归),但可以增加匹配限制。有关匹配限制的详细信息,请参阅 The match context 中的“pcre2api”。

来自pcre2limits man page

  

括号内的子模式数量没有限制,   但是不能超过65,535个捕获子模式。

     但是,括号的嵌套深度有限制   各种子模式。这是为了限制金额   编译时使用的系统堆栈。 PCRE2可以指定限制   建成;默认值为250。

  

命名子图案的最大数量为10,000。

Philip Hazel。最后更新时间:2014年11月25日。 - *截至PCRE2版本10.20

PCREPCRE2

中的尺寸限制

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包

pcre2-10.20 \ README 编写, PCRE2有一个计数器,用于限制模式中括号的嵌套深度。这限制了模式在编译时使用的系统堆栈数量。默认值为250,但您可以通过设置来更改它,例如--with-parens-nest-limit=500 PCRE2有一个计数器,可以设置为限制匹配模式时使用的资源量。如果在匹配期间超出限制,则匹配失败。默认值是一千万。您可以通过设置更改默认值,例如--with-match-limit=500000

所以,似乎是反向引用的数量

  • 未硬编码到PCRE2
  • 如果匹配限制匹配限制递归参数,
  • 很可能取决于大小。

由于您自己构建了库,因此可以进一步增加库。

PCRE在线参考

来自regular-expressions.info

  

大多数正则表达式支持最多 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个小组。