2016-07-24 71 views
4

考慮以下內容:爲什麼我的正則表達式會這樣做?

foo:·····¶ 
·bar x··¶ 
·lorem ipsum····¶ 
dolorsitamet···¶ 
···¶ 
consectetur adipiscing elit: 

如果中間點表示空間和表示換行符。

(?:foo:\s*)(.+)(?:\n\s*)的空白行的三個空間相匹配的正則表達式,但(?:foo:\s*)(.+)(?:\n\s+)相匹配並不能包括以下dolorsitamet換行符的正則表達式。爲什麼*角色不會貪婪地表現出來?人們期望第三組(?:\n\s*)匹配

¶ 
···¶` 

我的正則表達式模式爲多,DOTALL。

回答

1

貪婪的本性是不是這裏的問題。問題是,當你使用:

\n\s* 

而且,由於.+在此之前是貪婪的,在輸入文本即(last-1)th線(即具有3位線)\n\s*比賽最後\n和停止。

RegEx Demo 1

但是,當您使用

\n\s+ 

由於量詞+的存在,它需要空白後\n至少一個因此它不能在(last-1)th線匹配\n(自最後一行在開始時沒有任何空格)。因此,它在該行相匹配\n開始dolorsitamet爲下一行起動時有白色的空間。

RegEx Demo 2

+0

是的,我使用Regex101手藝正則表達式。我真正想要的是,它匹配'富之間的一切:·····¶'和dolorsitamet後'空白...'(我不關心尾隨空白,但不換行),但它也應該請返回目前爲此處的文字提供的內容 https://regex101.com/r/jZ5hU0/1。 什麼是正確的方法來搭配呢? –

+1

沒關係,我找到了解決辦法是 '(:FOO:\ S *?)(+?)((:$)|(?:?\ n \ + \ n))' –

+0

有點簡單:' (?:FOO:\ S *)(\ n \ S + \ N | $)'(+?) – anubhava

1

它貪婪的表現。但是,爲了在末尾匹配\n\s+,它需要匹配一個換行符,後跟至少一個空格字符。在這種情況下,這是倒數第二個換行符,三個空格和最後一個換行符。

如果它不止於此,.+將捕獲更多,但最後一部分將不匹配,正則表達式引擎將尋找一個較不貪婪的解決方案,這是它發現的。

相關問題