2013-02-02 79 views
4

我正在調查dflydev的MarkdownParser。 在doBlockQuotesline 1167,他們使用Atmoic集團上的整體表達。 我知道Atmoic分組但我不明白它在這有什麼用處?原子組在Markdown正則表達式

爲什麼是這樣的:

/ 
(     # Wrap whole match in $1 
    (?> 
     ^[ ]*>[ ]? # ">" at the start of a line 
     .+\n   # rest of the first line 
     (.+\n)*  # subsequent consecutive lines 
     \n*   # blanks 
    )+ 
) 
/xm 

比這更好的:

/ 
(     # Wrap whole match in $1 
     ^[ ]*>[ ]? # ">" at the start of a line 
     .+\n   # rest of the first line 
     (.+\n)*  # subsequent consecutive lines 
     \n*   # blanks 
) 
/xm 
+0

如果你瞭解原子團體,你應該明白他們在這裏的幫助。 – Gumbo

+0

我理解的例子[這裏](http://www.regular-expressions.info/atomic.html),但在這種情況下..什麼是兩人的表情我給的區別? – tamir

回答

3

+量詞以下的原子團意味着正則表達式引擎將嘗試匹配的組中的一個或多個內的圖案倍。這與引擎只嘗試匹配一次模式的第二個表達式不同。

+之後沒有延遲修飾符?,所以它會貪婪地匹配,即儘可能多次匹配。

分組因爲以及製備該組非捕獲,它防止任何回溯整個子表達式的每個完整匹配後很可能作出原子。

如果或者一旦組尾端的\n*由於+而無法匹配換行符,引擎將開始嘗試再次匹配組。如果不能這樣做,那麼因爲該組是原子的,所以現有的匹配將被返回。

如果該組沒有原子時,發動機就會回溯到嘗試匹配什麼剛剛成功匹配不同的方式,試圖再次匹配組開始之前。

例如,如果匹配的最後三個字符是換行符,\n*,它會先給出最後一個字符並嘗試再次匹配組的起始位置。如果失敗了,它會提供另一個新行,然後再試一次,依此類推。

回溯將繼續在(.+\n)*序列,並在那裏,因爲什麼被.和多少個字符由+*匹配匹配兩者的靈活性,將有非常多的方法,使引擎可以在嘗試再次匹配之前匹配模式。

字符串的相同部分可以通過許多不同方式與整個子表達式匹配,因此在引擎確定沒有進一步匹配之前可能會有大量低效,耗時的回溯。 。

原子組表示這可以避免。

+1

完美分析 – Anirudha