检查字符串是否是javascript中未知子字符串的重复

检查字符串是否是javascript中未知子字符串的重复,javascript,regex,Javascript,Regex,我尝试用这里提到的regexp解决javascript中的相同问题: 我将中的正则表达式转换为Javascript:^(+++{2,}$ 但它并没有像我预期的那样起作用: 'SingleSingleSingle'.replace(/^(.+){2,}$/m, '$1') // returns 'e' instead of exptected 'Single' 我忽略了什么?我目前没有解释为什么它返回e,但是匹配任何字符,{2,}基本上只是指“匹配任意两个或更多字符” 您希望通过使用反向引用来

我尝试用这里提到的regexp解决javascript中的相同问题:

我将中的正则表达式转换为Javascript:
^(+++{2,}$
但它并没有像我预期的那样起作用:

'SingleSingleSingle'.replace(/^(.+){2,}$/m, '$1')  // returns 'e' instead of exptected 'Single'

我忽略了什么?

我目前没有解释为什么它返回
e
,但是
匹配任何字符,
{2,}
基本上只是指“匹配任意两个或更多字符”

您希望通过使用反向引用来匹配捕获组中捕获的内容:

/^(.+)\1+$/m


我刚刚注意到,这也是您链接到的答案建议使用的:
/(.+)\1+/
。表达式是完全相同的,JavaScript没有什么需要更改的。

我认为得到“e”的原因是
{2,}
意味着对前面的正则表达式重复两次或更多次匹配,在本例中是
(.+)
{2,}
不保证重复项彼此匹配,只保证它们都符合
(.+)
的匹配条件

从我所看到的(使用)它看起来像是第一场比赛
(.+)
是“singlesingl”(由于贪婪匹配),第二个匹配是“e”。由于捕获组只记得上次匹配,因此replace()会返回“e”。如果使用
(.+?)
(用于非贪婪或不情愿的匹配),每个字符都将匹配,但仍然只会得到最后一个字符“e”


正如Felix所提到的,使用反向引用是我所知道的确保重复相互匹配的唯一方法。

由于“^”和“$”的原因,我认为
^(+.+){2,}$
应该匹配整个字符串。也许量词的贪婪或懒惰可以解释这种情况——但对我来说这似乎很奇怪。不过,您的解决方案是可以的。(我误解了Ruby示例:我认为它使用的量词语法与JS不同。)谢谢!