我正在做一些正则字谜。我决定使用其中一个表达式,并将其应用于一些实际的文本(使用Notepad++),以确切地了解发生了什么。这让我很困惑!
我所匹配的准则是:
(.)+\1
我应用它的案文是:
商务园区-阅读区内具有会议功能的研究商业园区 绿色公园-昂贵且不允许做广告,除非通过他们的通讯。 阿灵顿商业公园-无设施泰晤士河谷科学园(TVSP) 睡眠
我得到的匹配是(注意如何匹配可以是中间字):
Business Parks - Research business
Green Park - expensive and no advertising allowed except via their newslett
Arlington Business
Thames Vall
Slee
如果有人能带我经历一下这里发生的事情,我会非常感激的。我预料到了一些结果,因为“1”使得重复的字符得到匹配。然而,我特别困惑为什么‘绿色’被评估,并继续到‘新闻网’。
发布于 2018-05-08 15:33:47
(.)+
似乎与预期的一个或多个字符匹配,但在每次匹配后,将更新捕获的文本。因此,它是从字符串的开头到最后一个双倍字符之间的匹配。\1
正在匹配(.)
的前一个匹配项,这通常是前一个字符与\1
可以匹配的字符。
发布于 2018-05-08 15:48:38
(.)+\1
匹配从字符串开始到最后一个重复字符的所有内容。
然而,我特别困惑为什么‘绿色’被评估,并继续到‘新闻网’。
这是因为单独使用的+
是贪婪的,它占用了它所能做的一切。
如果你想让比赛停止在绿色,(.)+?\1
可以与?
一起使用,阻止+
的贪婪,并匹配多个组而不是一个大组。
发布于 2018-05-08 16:32:10
其他的答案已经做了一些细节,但还有更多的幕后.如果我们将您的正则表达式分为两部分,它们将是(.)+
和\1
。对于引擎返回匹配,这两种模式都应该成功,如果完全失败,则应该失败。
这个(.)+
一次只消耗一个字符,但一直持续到行尾,然后回溯。这意味着它不会停止寻找\1
,除非它是在匹配时完成的。
到达行尾后,会发生来自(.)+
的回溯--一次一个字符,下一个模式,即\1
试图在每一步匹配。
这就像从线的末端开始一个匹配,所以一个接近线尾的匹配就能尽快满足引擎的要求。
https://stackoverflow.com/questions/50237290
复制相似问题