我在我的 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 其余的将被视为字符串.
最佳答案
捕获组的最大数量是65,535。这也是模式或替换中可以反向引用的最大组数。
但是,一般来说,一场比赛可能会达到另一个限制,然后才能允许那么多组:例如主题字符串的最大长度,或内部调用 match() 的次数(总计或递归),但可以增加匹配限制。有关匹配限制的详细信息,请参阅 The match context 中的“pcre2api” .
There is no limit to the number of parenthesized subpatterns, but there can be no more than 65,535 capturing subpatterns.
There is, however, a limit to the depth of nesting of parenthesized subpatterns of all kinds. This is imposed in order to limit the amount of system stack used at compile time. The limit can be specified when PCRE2 is built; the default is 250.
和
The maximum number of named subpatterns is 10,000.
作者:菲利普黑兹尔。最后更新:2014 年 11 月 25 日。- *截至 PCRE2 版本 10.20
PCRE 和 PCRE2 具有相同的限制:
重复量词中的所有值限制为 65,535。
无限数量的带括号的子模式
(尽管它仅限于各种带括号的子模式的嵌套深度)。
65,535 捕获子模式。
10,000 个命名子模式。
嵌套括号的默认最大深度为 250
(PCRE2_CONFIG_PARENSLIMIT 的值)。
命名子模式的名称的最大长度为 32 个代码单元。
一个字符表示为 1+ code units (取决于编码)。例如。在 UTF-8 中,“Ç”有 2 个代码单元:0xC3 0x87
向后引用的数量没有限制。
对后续子模式的前向引用的数量限制在 200,000 左右。
控制动词中使用的名称限制为 255(8 位)和 65,535(16 或 32 位)。
PCRE2_CONFIG_MATCHLIMIT 的默认值为 10,000,000 (10m)。
PCRE2_CONFIG_RECURSIONLIMIT 的默认值为 10,000,000 (10m)。
(此限制仅在设置小于 MATCH_LIMIT 时适用)。
如果使用默认的内部链接大小 2 编译,则编译模式的最大长度为 64K 代码单元(详情请参阅 pcre2build documentation)。
主题字符串的最大长度是整数变量可以容纳的最大正数(可能是~1.8E+19)。但是,可用堆栈空间可能会限制特定模式可以处理的主题字符串的大小。
主题字符串的最大长度(以代码单元为单位)比 PCRE2_SIZE 变量可以容纳的最大数字小一。 PCRE2_SIZE 是一个无符号整数类型,通常定义为size_t。
关于c++ - pcre2_substitute() 函数支持多少捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923192/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。