首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex -嵌套的前瞻性断言

Regex -嵌套的前瞻性断言
EN

Stack Overflow用户
提问于 2014-05-29 08:20:37
回答 2查看 3.4K关注 0票数 3

假设我们想要匹配本文中的所有one(选项:点匹配所有):

代码语言:javascript
复制
<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>

假设我们使用这个模式:

代码语言:javascript
复制
one(?=(?:(?!<out>).)*</out>)

如果有人解释regex引擎如何一步一步地处理这个模式,以及它在处理的每一个阶段中的位置(在原始文本中的位置),我真的很感激;(类似于接受@提姆·皮茨克对这个问题的有益解释:Regex -前瞻性断言)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-29 09:01:31

许多 工具存在是为了自动解释正则表达式所做的操作,逐个字符。

但是,其背后的想法是,您想要检查one后面跟着</out>,同时禁止输入一个新的out标记:如果有一个...</out>追随者,而且我们还没有进入一个新的<out>...</out>结构,我们就知道我们已经在其中了。

因此,如果后面跟着one,并且两者之间没有<out>,那么正则表达式将与<out>匹配。

这项工作由(?:(?!<out>).)*完成:只有当.不是<out>中的第一个<时才匹配。因此,我们只能通过使用不是这个<的字符,然后是out>,才能进入<

提高速度的办法是:

代码语言:javascript
复制
one(?=(?:[^<]*+|<(?!out>))*+</out>)

深入到每个字符的负前瞻中,会大大增加匹配该字符的成本。在这里,[^<]*+将直接匹配到下一个可疑的<,我们只在必要时执行消极的前瞻检查。

票数 4
EN

Stack Overflow用户

发布于 2014-05-29 08:31:31

以下是来自这里的解释

代码语言:javascript
复制
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-ahead
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23928840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档