我在c程序中有以下文本字符串和正则表达式模式:
char text[] = " identification division. ";
char pattern[] = "^(.*)(identification *division)(.*)$";
使用regexec()库函数,我得到了以下结果:
String: identification division. Pattern: ^(.*)(identification *division)(.*)$ Total number of subexpressions: 3 OK, pattern has matched ... begin: 0, end: 37,match: identification division. subexpression 1 begin: 0, end: 8, match: subexpression 2 begin: 8, end: 35, match: identification division subexpression 3 begin: 35, end: 37, match: .
我想知道,因为正则表达式引擎以贪婪的方式匹配,并且第一个捕获组(。*)匹配任意数量的字符(新行字符除外)为什么它不匹配字符一直到最后文本字符串(最多为'。')与仅匹配前8个空格相反?
每个捕获组都必须匹配吗?
是否有关于捕获组如何匹配文本字符串的规则?
感谢。
答案 0 :(得分:1)
正则表达式尽可能贪婪,而不是太贪心。如果左派团体像你期望的一样贪婪,那么匹配“身份识别部门”的团体将无法匹配,会错误地拒绝text
,这显然是在语言中。
答案 1 :(得分:0)
就像你说的那样,如果贪婪的组(。*)已经消耗了整个字符串,那么正则表达式的其余部分将没有任何匹配,这将使你的正则表达式与字符串不匹配。所以,是的,每个捕获组(和其他模式部分)需要匹配。这正是您在正则表达式中指定的内容。
尝试使用以下字符串,并使用不情愿和贪婪的第一组运行代码,您将看到差异。
char text[] = " identification division identification division. ";