【发布时间】:2012-03-02 06:33:21
【问题描述】:
我正在编写正则表达式来检查是否有一个子字符串,该子字符串包含至少 2 个彼此相邻的某些模式的重复。我将正则表达式的结果与前一个字符串匹配 - 如果相等,则存在这样的模式。最好举个例子:1010 包含模式 10,它在连续系列中出现 2 次。另一方面,10210 不会有这样的模式,因为这 10 个不相邻。
更重要的是,我需要找到可能的最长模式,并且它的长度至少为 1。我已经编写了表达式来检查它^.*?(.+)(\1).*?$。为了找到最长的模式,我在模式之前使用了非贪婪版本来匹配某些东西,然后模式匹配到组 1,并且再次匹配与组 1 匹配的相同的东西。然后匹配字符串的其余部分,产生相等的字符串。但是存在一个问题,即正则表达式在找到第一个模式后急于返回,并且没有真正考虑到我打算在尽可能短的前后使这些子字符串变得尽可能短(让其余的尽可能长)。所以从字符串01011010 我得到了正确的匹配,但是存储在第1组中的模式只是01,尽管我会除了101。
因为我相信我不能在“更不贪婪”之前和之后让模式“更贪婪”或垃圾,所以我只能想出一个让正则表达式不那么渴望的想法,但我不确定这是否是可能的。
更多示例:
56712453289 - no pattern - no match with former string
22010110100 - pattern 101 - match with former string (regex resulted in 22010110100 with 101 in group 1)
5555555 - pattern 555 - match
1919191919 - pattern 1919 - match
191919191919 - pattern 191919 - match
2323191919191919 - pattern 191919 - match
使用当前表达式我会得到什么(使用相同的字符串):
no pattern - no match
pattern 2 - match
pattern 555 - match
pattern 1919 - match
pattern 191919 - match
pattern 23 - match
【问题讨论】:
-
如果你提供一系列的例子和你想要的结果,这个问题会更容易回答。
-
@JohnFeminella 给定一个字符串,他想找到与
(.+)(\1)模式匹配的最长子字符串。所以对于输入yabyababyab,他想找到子字符串abyababyab(而不是yabyab)。 -
/^.*?(.+)(\1).*?$/与/(.+)(\1)/相同。 (除了第一个跑得慢) -
@BradGilbert true,但仅在查找重复子字符串的上下文中。第一个将执行此操作并生成与前一个字符串匹配的字符串(这意味着如果没有找到模式,则这两者之间将不会匹配).. 但是如果您告诉检查零大小组,您将再次成为真的1 会是更好的选择,这就是问题首先被解决的方式。
标签: regex perl pattern-matching