正则表达式:“(。)+ \ 1”如何工作?

时间:2018-05-08 15:30:13

标签: regex

我正在研究一些regex crosswords。我决定采用其中一个表达式并将其应用于一些现实生活中的文本(使用Notepad ++),以确切了解发生了什么。这让我感到困惑!

我匹配的正则表达式是:

(.)+\1

我申请的文字是:

  

商业园区 - 阅读区的研究商业园区,具有会议功能

     

绿色公园 - 价格昂贵,除了通过新闻通讯外不允许广告

     

阿灵顿商业园 - 没有设施泰晤士河谷科学园(TVSP) -

     

睡眠

我得到的比赛是(注意匹配可以是中间词):

Business Parks - Research business
Green Park - expensive and no advertising allowed except via their newslett
Arlington Business
Thames Vall
Slee

如果有人能引导我了解这里发生的事情,我将非常感激。我预计会有一些结果导致重复的字符由于'\ 1'而匹配。然而,我特别难过为什么'格林'得到评估并仍然继续'newslett'。

3 个答案:

答案 0 :(得分:1)

(.)+似乎正如预期的那样匹配一个或多个字符,但是,对于每个匹配,更新捕获的文本。因此它从字符串的开头到最后一个双字符匹配。 \1(.)的上一个匹配相匹配,\1始终是Private Sub btnRange_Click(sender As Object, e As EventArgs) Handles btnRange.Click Dim firstDate As Date Dim secDate As Date firstDate = DateTimePicker1.Text secDate = DateTimePicker2.Text If firstDate = secDate Then ElseIf firstDate > secDate Then MessageBox.Show("Please enter a valid date range") Else ListBox1.Items.Add(firstDate) Do Until firstDate = secDate firstDate = firstDate.AddDays(1) ListBox1.Items.Add(firstDate) Loop End If End Sub 可以匹配的前一个字符。

答案 1 :(得分:0)

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

  

然而,我特别难过为什么' Green'得到评估和   仍然继续追踪' newslett'。

这是因为单独使用+是贪婪的,并且可以随身携带它。

如果您希望匹配停止为绿色,(.)+?\1可能会与?一起使用,阻止+的贪婪并匹配多个群组而不是一个大群组

Demo

答案 2 :(得分:0)

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

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

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

这就像从行尾开始匹配,所以接近行尾的匹配尽快满足引擎。