如何编写排除特定模式的正则,统计字符串中子串的出现次数
解决方案
问题根源:原有正则没有排除HTML属性中的匹配项,且通过RegExp构造函数传参时,单词边界\b属于正则特殊字符,在字符串中需要转义为\\b才能正常生效。调整逻辑如下:
- 新增负向后行断言,排除匹配结果前缀为
id="、class="的场景 - 新增正则特殊字符转义逻辑,避免传入的检索词包含正则特殊字符时出现异常
调整后可运行代码:
function countOccurences(str,word){ // 转义检索词中的正则特殊字符,避免注入问题 const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // (?<!(id|class)\s*=\s*["']) 负向后行断言:跳过id、class属性值内的匹配 const regex = new RegExp(`(?<!(id|class)\\s*=\\s*["'])\\b${escapedWord}\\b`, "gi"); console.log((str.match(regex)|| []).length); } const testStr = ' test TEST TESTING Test I like testing <h3>TEST</h3> class="test id="test" '; const asset = "Test"; countOccurences(testStr,asset); // 输出结果为4,符合预期
内容的提问来源于stack exchange,提问作者Souvik Guha
相关产品推荐
相关产品推荐

