JS中RegExp构造函数无法正确设置重复匹配次数如何解决
问题原因
你标注的正则构造行存在的核心问题是没有对正则元字符做转义:如果待匹配的字符是.、*、+、?、^、$、|、\、(、)、[、]、{、}这类正则特殊字符时,拼接后生成的正则会完全不符合预期,匹配逻辑直接出错。
另外你当前代码还存在两个隐含问题:
- 当某个字符不存在连续2次以上的匹配时,
word.match(regExp)会返回null,直接调用.length会抛出类型错误 - 你现在往数组里push的是匹配到的连续子串的个数,不是每个连续子串的长度,完全不符合你计算最长连续子串长度的需求
修正方案
第一步:新增正则特殊字符转义方法
function escapeRegExp(char) { return char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }
第二步:修正正则构造行及后续匹配逻辑
你标注的代码行需要增加转义处理,修正后写法如下:
const regExp = new RegExp(`${escapeRegExp(element)}{2,}`, "g");
完整可运行代码:
const word = "fkffhjhlkjhkjhkjhqqqhqkqkqkhk"; const toCharWord = Array.from(word); const uniqueChars = new Set(toCharWord); console.log(uniqueChars); function escapeRegExp(char) { return char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } let maxLength = 0; for (let element of uniqueChars) { // 修正后的正则构造行 const regExp = new RegExp(`${escapeRegExp(element)}{2,}`, "g"); const matchResult = word.match(regExp); if (matchResult) { matchResult.forEach(str => { if (str.length > maxLength) maxLength = str.length; }) } } console.log(maxLength); // 示例字符串输出结果为3,对应连续出现3次的q
内容的提问来源于stack exchange,提问作者Samson Emelyanov
相关产品推荐
相关产品推荐

