我正在研究一些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'。
答案 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
可能会与?
一起使用,阻止+
的贪婪并匹配多个群组而不是一个大群组
答案 2 :(得分:0)
其他答案已经提供了一些细节,但幕后还有更多......
如果我们将您的正则表达式分为两部分,它们将是(.)+
和\1
。
两种模式都应该成功让引擎返回一个匹配,否则应该失败以完全失败。
此(.)+
一次消耗一个字符,但一直持续到行尾,然后回溯。这意味着它不会停止寻找\1
,除非它在匹配时完成。
到达行尾后,发生(.)+
的回溯 - 一次出现一个字符,下一个\1
模式尝试在每一步匹配。
这就像从行尾开始匹配,所以接近行尾的匹配尽快满足引擎。