所以,我正在通过以下链接查看问题: Finding repeated substrings with R
发布的答案非常好,但我有疑问,如果字符串是
"111111111111"
然后输出
[1] "1111" "111" "11"
因为," 11"和" 111"包含在" 1111"不会那两个是多余的,怎么能克服这个?我的魔杖只是" 1111"此外,我从该问题中理解的是,代码必须输出最大长度的重复字符串。 考虑另一个例子:
"101110110110110"
预期输出为:
"110" "101" "011"
答案 0 :(得分:1)
对于经典模式,正则表达式引擎不能在同一位置多次匹配相同的字符。
使用字符abcde
的示例abc|bcd
模式只会为您提供一个结果(abc
)但不能为bcd
提供第二个匹配,因为bc
abc
1}}已经是第一个匹配结果的一部分。换句话说,您无法获得重叠匹配结果,因为在第二次尝试时,字符串中正则表达式引擎的位置是在第一个匹配(在abcde
之后)之后。
对于某些重要的事情,如果将所有模式放在先行断言(并且如果使用捕获组来获取某些内容),则可以通过技巧获得重叠结果。这个技巧使用了前瞻不匹配的事实,它只是对当前正则表达式引擎位置的测试,但没有什么不允许将捕获组放入其中。
(?=(abc|bcd))
和a
的示例:模式在b
位置和abc
位置成功,但两个完整匹配结果将为空,但是您将获得的第一个捕获组bcd
和(?=(abc|abcd))
。
但是,始终无法从字符串中的相同位置获取多个结果,因为正则表达式引擎每次获得结果时都会前进到下一个字符(或者根本不获取任何内容)。
如果使用相同的字符串测试此模式abc
,则只能在捕获组中获取s <- '111111111111'
m <- gregexpr('(?=(.{2,})\\1{2,})', s, perl=TRUE)
unique(mapply(function(x, y) substr(s, x, x+y-1),
attr(m[[1]], 'capture.start'),
attr(m[[1]], 'capture.length')))
。再一次,相同的位置无法测试两次。
关于您的具体示例
这是测试代码:
s
模式的目标是找到长度大于1个字符且重复次数超过1次的子字符串,重复的子字符串必须是连续的。
{{1}}包含十二个字符。如上所述,正则表达式引擎将在每个位置测试整个模式。由于量词在默认情况下是贪婪的,因此您将获得每个位置的最长结果。
结果:
模式成功七次。代码的第二部分仅删除重复项。