考虑以下文字:
foo:·····¶
·bar x··¶
·lorem ipsum····¶
dolorsitamet···¶
···¶
consectetur adipiscing elit:
中间点表示空格,¶
表示换行符。
正则表达式(?:foo:\s*)(.+)(?:\n\s*)
匹配空白行上的三个空格,但正则表达式(?:foo:\s*)(.+)(?:\n\s+)
匹配并且不包括dolorsitamet
之后的换行符。为什么*角色不贪婪?可以预期第三组(?:\n\s*)
匹配
¶
···¶`
我的正则表达式模式是多行,dotall。
答案 0 :(得分:1)
确实表现得很贪婪。但是,为了在最后匹配inline int max(int x, int y) { return x > y ? x : y; }
,它需要匹配换行符后跟至少一个空格字符。在这种情况下,这是倒数第二个换行符,三个空格和最后一个换行符。
如果它没有停在那里,\n\s+
将捕获更多,但最后一部分将不匹配,正则表达式引擎将寻找一个不太贪心的解决方案,这是它找到的。
答案 1 :(得分:1)
贪婪的本性不是问题所在。问题在于您使用:
\n\s*
由于此前.+
是贪婪的,\n\s*
与输入文本中的最后\n
匹配,即(last-1)th
行(即带有3个空格的行)并停止。
但是,当你使用
时\n\s+
由于存在量词+
,因此\n
后需要至少一个空格,因此无法与\n
行中的(last-1)th
匹配(因为最后一行在开始时没有任何空格。因此,它匹配以\n
开头的行中的dolorsitamet
,因为下一行在开头有空格。