我尝试使用此处提到的正则表达式在 javascript 中解决相同的问题:检查字符串是否重复未知子字符串
我在Javascript的第一个答案中翻译了正则表达式:^(.+){2,}$
但它不像我预期的那样工作:
'SingleSingleSingle'.replace(/^(.+){2,}$/m, '$1') // returns 'e' instead of exptected 'Single'
我在看什么?
我尝试使用此处提到的正则表达式在 javascript 中解决相同的问题:检查字符串是否重复未知子字符串
我在Javascript的第一个答案中翻译了正则表达式:^(.+){2,}$
但它不像我预期的那样工作:
'SingleSingleSingle'.replace(/^(.+){2,}$/m, '$1') // returns 'e' instead of exptected 'Single'
我在看什么?
我目前没有解释为什么它返回e
,但.
匹配任何字符,.{2,}
基本上只是意味着“匹配任何两个或更多字符”。
您想要的是通过使用反向引用来匹配您在捕获组中捕获的任何内容:
/^(.+)\1+$/m
我刚刚注意到,这也是您链接到的答案建议使用的内容:/(.+)\1+/
. 表达式完全相同,您无需为 JavaScript 更改任何内容。
我认为你得到 'e' 的原因是{2,}
,在这种情况下,这意味着与前面的正则表达式匹配两次或多次重复(.+)
。{2,}
不保证重复项相互匹配,只保证它们都符合匹配条件(.+)
。
从我所看到的(使用Expresso)看来,第一个匹配项
(.+)
是“SingleSingleSingl”(由于贪婪匹配),第二个匹配项是“e”。由于捕获组只记住他们的最后一场比赛,这就是为什么 replace() 会返回“e”。如果您使用(.+?)
(用于非贪婪或不情愿的匹配)每个单独的字符将匹配,但您仍然只会得到最后一个,'e'。
正如 Felix 所提到的,使用反向引用是我所知道的保证重复相互匹配的唯一方法。