首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么"abcdef“不是由(?=abc)def匹配,而是由abc(?=def)匹配?

为什么"abcdef“不是由(?=abc)def匹配,而是由abc(?=def)匹配?
EN

Stack Overflow用户
提问于 2013-06-10 01:17:42
回答 3查看 2.8K关注 0票数 7

在Javascript中,我有一个字符串abcdef,无法发现这种奇怪的行为:

  • (?=abc)def与字符串不匹配
  • abc(?=def)确实与字符串匹配

为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-10 01:23:22

(?=abc)def中,(?=abc)捕获为零宽度,并且在成功匹配后不会在输入字符串中向前移动光标。这个构造简单地说,向前看下三个字符,看看它们是否为abc,然后检查它们是否为def。现在比赛失败了..。

您需要了解regex引擎是如何完成匹配的。考虑输入字符串abcdef和regex abc(?=def)。引擎首先匹配a,然后将输入字符串中的游标移到下一个字符,然后尝试匹配b,因为输入字符串中的游标位于b上,匹配成功。然后引擎将游标移动到输入字符串中,并尝试匹配c,并且由于游标在输入字符串中,所以匹配成功,并且输入字符串中的游标再次移动到下一个字符。现在引擎遇到了(?=def),引擎只是向前看,看看接下来的三个字符是否实际上是def,而没有移动游标,并且匹配成功。

现在考虑输入字符串xyz和regex x(?=y)Z。regex引擎将光标放在输入字符串中的第一个字母上,并检查它是否为x,并发现是一个x,因此它将游标移动到输入字符串中的下一个字符。现在,我们来看看下一个字符是否是y,但引擎没有移动输入文本游标前言,因此输入文本中的游标保持在y上。接下来,引擎将查看光标是否位于字母z上,但是由于输入文本中的游标仍然位于字母y上,所以匹配失败。

你可以在http://www.regular-expressions.info/lookaround.html读到更多关于正面和负面观点的文章。

票数 19
EN

Stack Overflow用户

发布于 2013-06-10 01:23:41

javascript中的目视头的MDN定义

x(?=y) 只有当'x‘后面跟着'y’时才匹配'x‘。这就是所谓的前瞻性。 例如,只有在/Jack(?=Sprat)/后面跟着'Sprat‘时,它才会匹配'Jack’。只有在后面跟着'Sprat‘或'Frost’时,/Jack(?=Sprat|Frost)/才能匹配'Jack‘。然而,“斯普拉特”和“霜冻”都不是比赛结果的一部分。

因此,(?=y)前面是另一个语句,在本例中是一个空字符串,只有当第一个语句后面跟着第二个语句时,它才会匹配。如果没有前面的语句,表达式(?="abc")将匹配前3个字符abc而不捕获它们,然后再次检查这些字符是否为def,这将失败。

票数 2
EN

Stack Overflow用户

发布于 2013-06-10 01:37:56

根据你对我的评论的回应,我认为你想要的是一个http://www.regular-expressions.info/lookaround.html#lookbehind

代码语言:javascript
运行
复制
(?<=abc)def

编辑:

既然您使用的是JavaScript (对不起,我只读到您的问题--我没有看标签),为什么不使用一个常规的捕获组并将匹配包含在替换模式中呢?

代码语言:javascript
运行
复制
"abcdef".replace(/(abc)def/, "$1")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17015761

复制
相关文章

相似问题

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