JavaScript如何检测字符串中的多字符重复子串模式
多字符重复模式检测函数实现
现有代码问题
你当前的实现只能检测单字符连续重复的场景,核心问题是正则里的捕获组(\S)仅能匹配单个非空白字符,后续的反向引用也只能针对这个单字符做匹配,无法识别多个字符组成的重复子串,而且提前把空白替换成下划线的操作也没有必要。
现有代码如下:
function detectPattern(string) { string = string.replace(/\s+/g,"_"); return /(\S)(\1{15,})/g.test(string); }
实现思路
要检测多字符组成的连续重复子串,核心逻辑如下:
- 用捕获组匹配任意长度的连续子串作为待校验的模式
- 用反向引用检查该模式是否在后续连续重复出现多次
- 可以根据业务需求调整模式的最小长度、最小重复次数,避免把单字符重复、过短的偶然重复误判为有效模式
- 不需要提前替换空白字符,正则原生支持匹配包含空格的子串
可直接使用的代码
版本1:校验整个字符串完全由重复模式拼接组成
适配你给出的两个测试用例,只要字符串从头到尾是同一个子串重复多次拼接而成,就返回true:
function detectPattern(str) { // 正则解释: // ^ 匹配字符串开头 // (.+?) 非贪婪匹配长度至少为1的任意子串,存入捕获组 // \1+ 匹配捕获组对应的子串连续重复1次及以上(算上捕获组本身,模式总共出现至少2次) // $ 匹配字符串结尾 return /^(.+?)\1+$/.test(str); } // 测试验证 const str1 = "HelloHelloHelloHelloHelloHello"; const str2 = "Hello this is a repeated pattern Hello this is a repeated pattern Hello this is a repeated pattern Hello this is a repeated pattern"; console.log(detectPattern(str1)); // 输出true console.log(detectPattern(str2)); // 输出true
版本2:校验字符串中任意位置存在符合要求的重复模式
如果不需要整个字符串都是重复内容,只要字符串里存在连续重复的多字符子串就返回true,可以去掉首尾锚点,同时加上长度限制减少误判:
function detectPattern(str) { // 匹配规则:长度至少3个字符的子串,连续重复至少3次 // 可以根据需求调整大括号里的数值:{3,}是子串最小长度,后面{2,}是除了首次出现外还要重复至少2次 return /(.{3,}?)\1{2,}/.test(str); }
提示:如果你的场景里允许更短的模式、更少的重复次数,对应调整正则里的量词即可,比如要匹配长度至少2的子串重复至少2次,就改成
/(.{2,}?)\1{1,}/
内容的提问来源于stack exchange,提问作者Mathéo RB
相关产品推荐
相关产品推荐

