2013-02-02 19 views
4

Я смотрю на dflydev's MarkdownParser. В doBlockQuotesline 1167, они используют Atmoic Group в целом выражение. Я знаю Атмосферная группировка, но я не понимаю, как это помогает здесь?Атомная группа в Markdown regex

Почему это:

/ 
(     # 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

Смежные вопросы