gpt4 book ai didi

c - 使用 PCRE 正则表达式的奇怪答案

转载 作者:行者123 更新时间:2023-12-05 01:34:44 28 4
gpt4 key购买 nike

我正在使用 C ( http://www.pcre.org/) 中的 PCRE 正则表达式库来解析和匹配我的 HTML 字符串。为了简化我的问题,假设我得到了源字符串:"aaa: bbbb:",以及我的模式:a(.*?):|b( .*?):,符号?表示是非贪婪匹配,所以答案应该是两种匹配:一种是"aaa:"和另一个"bbbb:",

然后我编程:

char *src = "aaa:  bbbb:";
char *pattern = "a(.*?):|b(.*?):";
pcre *re = NULL;

//---missing out---

re = pcre_compile(pattern, // pattern,
0, // options,
&error, // errptr,
&erroffset, // erroffset,
NULL); // tableptr,
while (
(rc = pcre_exec(re, // regex ptr,
NULL, // extra arg,
src, // subject,
strlen(src), // length,
0, // startoffset,
0, // options,
ovector, // ovector,
OVECCOUNT) // ovecsize,
)!=PCRE_ERROR_NOMATCH)
{
printf("\nOK, string has matched ...there are %d matchups\n\n",rc); //
for (i = 0; i < rc; i++)
{
char *substring_start = src + ovector[2*i];
int substring_length = ovector[2*i+1] - ovector[2*i];
printf("$%2d: %.*s length: %d\n", i, substring_length, substring_start,substring_length);
}
src = src + ovector[1]; // to move the src pointer to the end offset of current matchup
if (!src) break;
}
pcre_free(re);

我得到了我的结果:

Source : aaa:  bbbb:
Pattern: "a(.*?):|b(.*?):"

OK, string has matched ...there are 2 matches

$ 0: aaa: length: 4
$ 1: aa length: 2

OK, string has matched ...there are 3 matches

$ 0: bbbb: length: 5
$ 1: length: 0
$ 2: bbb length: 3

我想知道,我是怎么得到答案“$ 1: length: 0”的?

//-------------------------------------------- --------------------------------------------

@Jonathan Leffler 我认为你的回答是正确的。

刚才试过了

Source: "aaa: bbb: ccc:"
Pattern: "c(.+?):|a(.+?):|b(.+?):"

得到的结果是这样的:

$ 0: aaa: length: 4
$ 1: length: 0
$ 2: aa length: 2

$ 0: bbbb: length: 5
$ 1: length: 0
$ 2: length: 0
$ 3: bbb length: 3

$ 0: cccc: length: 5
$ 1: ccc length: 3

反过来证明你的答案:

正则表达式的捕获在找到匹配项时停止,因此 aaa: 在尝试匹配 c( .+?):,结果的第一行显示了整个字符串,#2 显示了与替代项匹配的结果偏移 c(.+?):

对于 b(.+?),它最终在正则表达式中被捕获,这解释了两个 length : 0

对于c(.+?),它首先被捕获,所以没有length : 0

最佳答案

正则表达式中有两个捕获,每个备选一个。但是,捕获是从左到右编号的。在第二种情况下,第一个 ($1) 捕获为空;它匹配的内容中没有a,所以第一个捕获是空的;第二个 ($2) 捕获包含您期望的 b

更令人惊讶的是,第二次捕获在第一次匹配时没有指定任何内容。如果没有数据,我猜捕获是空的。

关于c - 使用 PCRE 正则表达式的奇怪答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15245693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com