- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一些背景知识:我正在实现一个正则表达式匹配引擎 (NFA),它应该支持 PCRE 兼容模式(我的意思是它应该捕获与 PCRE 具有相同偏移量的子表达式)。
PCRE 的testinput1 中有一个测试,我无法完全理解。它测试惰性量词。
所以,正则表达式是
/<a[\s]+href[\s]*=[\s]* # find <a href=
([\"\'])? # find single or double quote
(?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
/isx
字符串是
<a href="abcd xyz pqr" cats
PCRE 的匹配是:
<a href="abcd xyz pqr"
而且它显然使用了惰性量词。
据我所知,除非另一种“贪婪”方式根本不可能,否则不应使用惰性量词。现在这是一个可能的贪婪匹配:
<a href="abcd
它使用条件子模式的否定分支,没有惰性量词。
因此,我正在寻找对此 PCRE 行为的解释或惰性量词为何在此测试中匹配的任何详细信息/建议。谢谢!
编辑:我还检查了 TRE图书馆作品。它是一个 POSIX 兼容的 NFA 引擎。我稍微修改了原始正则表达式以适应 TRE 的语法:
#include <stdlib.h>
#include <stdio.h>
#include <tre/tre.h>
int main()
{
regex_t preg;
const char * regex = "<a[ ]+href[ ]*=[ ]*(?:(')(.*?)'|[^ ]+)";
const char * string = "<a href='abcd xyz pqr' cats";
int cflags = REG_EXTENDED;
int eflags = 0;
size_t nmatch = 3;
regmatch_t pmatch[100];
tre_regcomp(&preg, regex, cflags);
tre_regexec(&preg, string, nmatch, pmatch, eflags);
for (int i = 0; i < nmatch; i++) {
printf("%d: (%d, %d)\n", i, pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so);
}
return 0;
}
输出(使用长度而不是结束偏移量)是:
0: (0, 22)
1: (8, 1)
2: (9, 12)
所以关于 PCRE 回溯特定行为的建议很可能是错误的...
最佳答案
首先,我只是 REGEX 世界的初学者。所以,如果这个答案有误或者我误解了这个问题,我很抱歉。
阅读此书的定义Regular Expressions Cookbook :
(?(1)then|else) is a conditional that checks whether the first capturing group has already matched something. If it has, the regex engine attempts to match then. If the capturing group has not participated in the match attempt thus far, the else part is attempted.
关于这个主题:<a href="abcd xyz pqr" cats
第一个捕获组匹配了第一个 "
特点。因此,预期的行为是尝试匹配 then 部分。 then 部分中的第二个捕获组设法匹配字符串 abcd xyz pqr
与 (.*?)
最后 then 部分设法匹配 abcd xyz pqr"
与 (.*?)\1
. REGEX 可能会成功完成。
因此,不需要带有 greddy 量词的 else 部分,实际上它没有被使用。就好像 greddy 量词从未存在过一样。
关于这个主题:<a href="abcd
第一个捕获组匹配了"
特点。现在 then 部分设法匹配字符串 abcd
与 (.*?)
但它永远不会匹配最后一个 "
字符,因为在主题末尾没有这样的字符。条件失败。
REGEX引擎不止于此,你用过([\"\'])?
因此,引擎可能会再次尝试,因为 "
字符是可选的,它会继续进行,就好像第一个捕获组不匹配一样(实际上有回溯)。因此,现在引擎达到第一个捕获组不匹配的条件,尝试 else 部分并设法匹配字符串 "abcd
。 (由于回溯,"
字符未与第一个捕获组匹配,现在它与 else 部分中的第三个捕获组匹配)REGEX 可能会成功完成。
PS:我正在学习有关正则表达式的有趣内容,所以这个答案可能是完全错误的。等待更好的答案。
关于regex - 惰性量词在 PCRE 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21156928/
运行 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
我是一名优秀的程序员,十分优秀!