假设我们想要匹配本文中的所有one(选项:点匹配所有):
<out>hello!</out>
<nx1>home one</nx1>
<nx2>living</nx2>
<out>one text
text one continues
and at last here ends one</out>
<m2>dog one</m2>
<out>bye!</out>假设我们使用这个模式:
one(?=(?:(?!<out>).)*</out>)如果有人解释regex引擎如何一步一步地处理这个模式,以及它在处理的每一个阶段中的位置(在原始文本中的位置),我真的很感激;(类似于接受@提姆·皮茨克对这个问题的有益解释:Regex -前瞻性断言)。
发布于 2014-05-29 09:01:31
许多 工具存在是为了自动解释正则表达式所做的操作,逐个字符。
但是,其背后的想法是,您想要检查one后面跟着</out>,同时禁止输入一个新的out标记:如果有一个...</out>追随者,而且我们还没有进入一个新的<out>...</out>结构,我们就知道我们已经在其中了。
因此,如果后面跟着one,并且两者之间没有<out>,那么正则表达式将与<out>匹配。
这项工作由(?:(?!<out>).)*完成:只有当.不是<out>中的第一个<时才匹配。因此,我们只能通过使用不是这个<的字符,然后是out>,才能进入<。
提高速度的办法是:
one(?=(?:[^<]*+|<(?!out>))*+</out>)深入到每个字符的负前瞻中,会大大增加匹配该字符的成本。在这里,[^<]*+将直接匹配到下一个可疑的<,我们只在必要时执行消极的前瞻检查。
发布于 2014-05-29 08:31:31
以下是来自这里的解释
NODE EXPLANATION
--------------------------------------------------------------------------------
one 'one'
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
(?: group, but do not capture (0 or more
times (matching the most amount
possible)):
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
<out> '<out>'
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
. any character except \n
--------------------------------------------------------------------------------
)* end of grouping
--------------------------------------------------------------------------------
</out> '</out>'
--------------------------------------------------------------------------------
) end of look-aheadhttps://stackoverflow.com/questions/23928840
复制相似问题