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

时间:2012-11-27 19:17:36

标签: javascript regex

我尝试使用此处提到的regexp在javascript中解决同样的问题:Check if string is repetition of an unknown substring

我将first answer中的正则表达式翻译为Javascript:^(.+){2,}$ 但它没有像我期望的那样起作用:

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

我在俯瞰什么?

2 个答案:

答案 0 :(得分:5)

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

您想要的是通过使用反向引用来匹配捕获组中捕获的任何内容:

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

我刚刚注意到这也是您链接的答案建议使用:/(.+)\1+/。表达式完全相同,您无需为JavaScript更改任何内容。

答案 1 :(得分:1)

我认为你得到'e'的原因是{2,}意味着两次或更多次重复匹配它之前的正则表达式,在这种情况下是(.+){2,}并不保证重复与 相互匹配 ,只是它们都符合(.+)的匹配条件。

从我所看到的(使用Expresso)看起来像第一场比赛 (.+)是'SingleSingleSingl'(由于贪婪匹配),第二个匹配是'e'。由于捕获组只记得他们的最后一场比赛,这就是为什么replace()会让你回到'e'。如果你使用(.+?)(对于非贪婪或不情愿的匹配),每个角色都会匹配,但你仍然只会得到最后一个,'e'。

正如费利克斯所提到的,使用反向引用是我所知道的唯一保证重复相互匹配的方式。