- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了一个案例,例如在正则表达式中使用\w 时,500 个带有空格的字母/数字会使 PCRE 崩溃。我尝试过 boh TPerlRegEx
和 Delphi XE2 pcre/obj 实现。两者都一样。
然后我尝试打电话
pcre_config(PCRE_CONFIG_MATCH_LIMIT, @vSysStrRegex_MatchLimit_Value);
但是设置匹配限制似乎没有任何效果。我使用它的方式是为每个线程调用一次。 (注意:其他人已将其设置为get而不是set这样的设置)
我真的需要正则表达式库退出解析,而不是继续解析,直到它溢出堆栈。 (似乎几乎不可能从中恢复线程/程序。)
在这种情况下如何防止堆栈溢出?我无法控制解析的内容或正则表达式。因此,我专门寻找通过设置或类似设置来避免 PCRE 遇到堆栈溢出的方法。
通过编辑 TPerlRegEx 代码解决方案:
function TPerlRegEx.Match(AStartOffset: Integer = 0): Boolean;
...
if FHints <> nil then // set by "study" call
begin
PPCREExtra(FHints)^.flags := PPCREExtra(FHints)^.flags or PCRE_EXTRA_MATCH_LIMIT_RECURSION;
PPCREExtra(FHints)^.match_limit_recursion := 750 // 1000 too much in tests
end
;
OffsetCount := pcre_exec(FPattern, FHints, ...)
最佳答案
您引用了some PCRE documentation它描述了使用 --with-match-limit-recursion
配置选项在编译时设置递归限制。如果您自己构建 PCRE 库,则可以使用该选项。如果您在同一文档的其他地方阅读,您会发现传递给 pcre_exec
的 pcre_extra
block 的 match_limit_recursion
字段的说明:
The default value for
match_limit_recursion
can be set when PCRE is built; the default default is the same value as the default formatch_limit
. You can override the default by supplingpcre_exec()
with apcre_extra
block in whichmatch_limit_recursion
is set, andPCRE_EXTRA_MATCH_LIMIT_RECURSION
is set in theflags
field. If the limit is exceeded,pcre_exec()
returnsPCRE_ERROR_RECURSIONLIMIT
.
因此,将递归限制设置为低于默认值。默认值显然比实际可用的堆栈空间还要高;如果它较低,那么您已经会收到PCRE_ERROR_RECURSIONLIMIT
错误,而不是操作系统引发的堆栈溢出异常。
我不知道 Delphi 特定的包装器如何表示此设置。
关于regex - Delphi PCRE/正则表达式实现和堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688064/
运行 uwsgi 时,我收到以下消息: !!! no internal routing support, rebuild with pcre support !!! 我已经使用以下命令安装了 pcre
我对 PCRE(Perl 兼容正则表达式)的强大功能很感兴趣,并想知道它们是否有可能成为所有主要语言的事实上的方法(我对 Java 感兴趣)。如有必要,我准备使用图书馆。 我也无法在 SO 中找到描述
我正在尝试生成一些可以触发 snort 警报的跟踪以测试 snort 的性能。但是在一些规则中有一些pcre选项包含/R,我不明白。 例如,在一个snort规则pcre中有一个pcre选项:"/^(\
什么是 PCRE 兼容语法? C# PCRE 兼容吗?从维基百科我发现了这个: Perl Compatible Regular Expressions (PCRE) is a regular expr
我迷路了。我有 Linux CentOS 操作系统。我试图在 pcre 网站上下载的 pcre 包中找到 pcre.h。我也按照安装指南中的说明进行了配置,但没有运气。有帮助吗? 最佳答案 最新版本叫
我正在尝试使用以下命令配置和制作 pcre ./configure CC="gcc" CFLAGS="-maix64" CXX="gcc" CXXFLAGS="-maix64" LDFLAGS="-L
我想要一个 Perl 正则表达式来匹配 std::foo但不匹配 std::foo::bar .这是我到目前为止: /((?
我想这或多或少是一个由两部分组成的问题,但首先是基础知识:我正在编写一些 PHP 以使用 preg_match_all 来查找以 {} 结尾的字符串的变量。然后它遍历每个返回的字符串,用 MySQL
我有以下文字: aabbaa aa bbc aa bbg aa bbd aa 我想找到 以 bb 开头且 不在 aa 和 aa 之间 的单词,而不管使用 PCRE 的匹配单词之
PCRE 正则表达式 /..(?<=(.)\1)/无法编译:“后向断言中不允许子模式引用。”有趣的是,它似乎在前瞻中是可以接受的,例如 /(?=(.)\1)../ , 只是不在回顾中。 是否有技术原因
我想一步一步地理解以下模式。 /\p{L}/u /u 是一个修饰符(http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php)
我有一个带有空值的文本源,我需要将它们与我的正则表达式模式一起拉出。正则表达式甚至可以匹配空字符吗? 当我的模式拒绝匹配时,我才意识到我有它们,当我将它粘贴到 Notepad++ 时,它显示了所有的空
我想演示我可以用制表符替换空格缩进,但只能替换每行的前导空格。 我想我可以通过可变宽度的后视来实现这一点。不幸的是,这在 PCRE 中是不允许的。 s/(?<=^|(?:[ ]{3})+)[ ]{3}
我必须在Python中基于PCRE解析一些字符串,而且我不知道该怎么做。 我想解析的字符串如下所示: match mysql m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/s p/M
在 Notepad++ 6.5.1 中,我需要替换引号对中的某些模式。我想将替换保存为宏的一部分,因此所有替换都需要一步完成。 例如,在下面的字符串中,将引号对中的所有“a”字符替换为破折号,而引号对
使用 PCRE 库...想要查找最多包含已知空格数的单词字符串。 即标记之间有 5 个空白字符。 foo bar foo bar foo bar = 第一个 foo 和最后一个 bar 之间....有
我想演示我可以用制表符替换空格缩进,但只能替换每行的前导空格。 我想我可以通过可变宽度的后视来实现这一点。不幸的是,这在 PCRE 中是不允许的。 s/(?<=^|(?:[ ]{3})+)[ ]{3}
谁能举个例子例如对于这个字符串 wordride plain fire 用另一个字母替换空格 例如替换 第一个匹配空格前第三个字母的空格 例如我想在单词后替换字符用这个 (?:\G(?!^)|w
我很惊讶不容易找到类似问题的答案。我想匹配某些功能中的所有内容。这个想法是删除无用的功能。 foo(some (content)) --> some (content) 所以我试图匹配函数调用中可以包
我希望将大量模式与 Web 文档中的各种 HTML 元素、属性和文本相匹配。 例如,我可能对 的内容感兴趣元素并有一个这样的正则表达式: pcre *test_filter = pcre_compi
我是一名优秀的程序员,十分优秀!