如何使用正则表达式查找字符串中的重复单词并正确捕获最小重复单元
正则表达式调整方案
问题原因
你当前使用的^(.*)\1+$中.*是贪婪匹配模式,会优先尽可能多地匹配字符,再回溯验证后续是否满足重复规则,因此捕获到的是最长的可重复单元,而非最小的。
调整方法
把贪婪匹配改为非贪婪匹配,仅需要在.*后添加?修饰符,最终正则为:^(.*?)\1+$
原理解释
.*?是非贪婪匹配模式,会优先从最短的字符长度开始尝试匹配,一旦找到可以满足后续\1+重复规则的内容就会停止扩展捕获范围,因此拿到的就是最小重复单元。- 如果你的重复单元有明确的字符范围(比如仅为英文字母),还可以进一步优化精准度,把
.*?替换为[a-zA-Z]+?,避免捕获到空字符串或非预期的特殊字符。
效果验证
针对codecodecodecode这类字符串,使用调整后的正则匹配,group(1)会直接返回最小重复单元code,符合需求。
内容的提问来源于stack exchange,提问作者Mehmet Gunduz
相关产品推荐
相关产品推荐

