2

我尝试使用此处提到的正则表达式在 javascript 中解决相同的问题:检查字符串是否重复未知子字符串

我在Javascript的第一个答案中翻译了正则表达式:^(.+){2,}$ 但它不像我预期的那样工作:

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

我在看什么?

4

2 回答 2

5

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

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

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

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

于 2012-11-27T19:25:26.720 回答
1

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

从我所看到的(使用Expresso)看来,第一个匹配项 (.+)是“SingleSingleSingl”(由于贪婪匹配),第二个匹配项是“e”。由于捕获组只记住他们的最后一场比赛,这就是为什么 replace() 会返回“e”。如果您使用(.+?)(用于非贪婪或不情愿的匹配)每个单独的字符将匹配,但您仍然只会得到最后一个,'e'。

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

于 2012-11-27T20:17:58.177 回答