0

我在 ac 程序中有以下文本字符串和正则表达式模式:

char text[] = "        identification     division. "; 
char pattern[] = "^(.*)(identification *division)(.*)$"; 

使用 regexec() 库函数,我得到以下结果:

字符串:标识划分。
模式:^(.*)(标识*除法)(.*)$
子表达式总数:3

好的,模式已匹配...

开始:0,结束:37,匹配:识别师。
子表达式 1 开始:0,结束:8,匹配:
子表达式 2 开始:8,结束:35,匹配:标识除法
子表达式 3 开始:35,结束:37,匹配:。

我想知道,因为正则表达式引擎以贪婪的方式匹配,并且第一个捕获组(。*)匹配任意数量的字符(换行符除外),为什么它不匹配文本字符串中的字符(最多 '.') 而不是只匹配前 8 个空格?

每个捕获组是否必须匹配?

是否有关于捕获组如何匹配文本字符串的规则?

谢谢。

4

2 回答 2

1

正则表达式尽可能贪婪,但不会太贪婪。如果左组像你想象的那样贪婪,匹配“标识划分”的组将无法匹配,错误地拒绝text,这在语言中很明显。

于 2012-05-28T13:31:30.927 回答
0

正如您所说,如果贪婪组 (.*) 消耗了整个字符串,则正则表达式的其余部分将没有任何可匹配的内容,这不会使您的正则表达式与字符串匹配。所以,是的,每个捕获组(和其他模式部分)都需要匹配。这正是您在正则表达式中指定的内容。

尝试使用以下字符串,并使用不情愿和贪婪的第一组运行代码,您将看到不同之处。

char text[] = "    identification  division    identification     division. ";
于 2012-05-28T13:31:16.073 回答