首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex:"(.)+\1“是如何工作的?

Regex:"(.)+\1“是如何工作的?
EN

Stack Overflow用户
提问于 2018-05-08 15:30:13
回答 3查看 2K关注 0票数 2

我正在做一些正则字谜。我决定使用其中一个表达式,并将其应用于一些实际的文本(使用Notepad++),以确切地了解发生了什么。这让我很困惑!

我所匹配的准则是:

(.)+\1

我应用它的案文是:

商务园区-阅读区内具有会议功能的研究商业园区 绿色公园-昂贵且不允许做广告,除非通过他们的通讯。 阿灵顿商业公园-无设施泰晤士河谷科学园(TVSP) 睡眠

我得到的匹配是(注意如何匹配可以是中间字):

代码语言:javascript
运行
复制
Business Parks - Research business
Green Park - expensive and no advertising allowed except via their newslett
Arlington Business
Thames Vall
Slee

如果有人能带我经历一下这里发生的事情,我会非常感激的。我预料到了一些结果,因为“1”使得重复的字符得到匹配。然而,我特别困惑为什么‘绿色’被评估,并继续到‘新闻网’。

EN

回答 3

Stack Overflow用户

发布于 2018-05-08 15:33:47

(.)+似乎与预期的一个或多个字符匹配,但在每次匹配后,将更新捕获的文本。因此,它是从字符串的开头到最后一个双倍字符之间的匹配。\1正在匹配(.)的前一个匹配项,这通常是前一个字符与\1可以匹配的字符。

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 15:48:38

(.)+\1匹配从字符串开始到最后一个重复字符的所有内容。

然而,我特别困惑为什么‘绿色’被评估,并继续到‘新闻网’。

这是因为单独使用的+是贪婪的,它占用了它所能做的一切。

如果你想让比赛停止在绿色,(.)+?\1可以与?一起使用,阻止+的贪婪,并匹配多个组而不是一个大组。

演示

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 16:32:10

其他的答案已经做了一些细节,但还有更多的幕后.如果我们将您的正则表达式分为两部分,它们将是(.)+\1。对于引擎返回匹配,这两种模式都应该成功,如果完全失败,则应该失败。

这个(.)+一次只消耗一个字符,但一直持续到行尾,然后回溯。这意味着它不会停止寻找\1,除非它是在匹配时完成的。

到达行尾后,会发生来自(.)+的回溯--一次一个字符,下一个模式,即\1试图在每一步匹配。

这就像从线的末端开始一个匹配,所以一个接近线尾的匹配就能尽快满足引擎的要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50237290

复制
相关文章

相似问题

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