我尝试使用此处提到的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'
我在俯瞰什么?
答案 0 :(得分:5)
我目前没有解释为什么它返回e
,但.
匹配任何字符,而.{2,}
基本上只是意味着“匹配任意两个或更多字符”。
您想要的是通过使用反向引用来匹配捕获组中捕获的任何内容:
/^(.+)\1+$/m
我刚刚注意到这也是您链接的答案建议使用:/(.+)\1+/
。表达式完全相同,您无需为JavaScript更改任何内容。
答案 1 :(得分:1)
我认为你得到'e'的原因是{2,}
意味着两次或更多次重复匹配它之前的正则表达式,在这种情况下是(.+)
。 {2,}
并不保证重复与 相互匹配 ,只是它们都符合(.+)
的匹配条件。
从我所看到的(使用Expresso)看起来像第一场比赛
(.+)
是'SingleSingleSingl'(由于贪婪匹配),第二个匹配是'e'。由于捕获组只记得他们的最后一场比赛,这就是为什么replace()会让你回到'e'。如果你使用(.+?)
(对于非贪婪或不情愿的匹配),每个角色都会匹配,但你仍然只会得到最后一个,'e'。
正如费利克斯所提到的,使用反向引用是我所知道的唯一保证重复相互匹配的方式。