正则表达式实现:替换字符串中指定数字但排除data-value属性内的目标内容
解决方法:用负向断言避开
data-value="4"中的数字4 嘿,这个场景太常见了!要精准替换字符串里的数字4,同时跳过data-value="4"属性里的内容,咱们可以靠正则的负向零宽断言来实现,完美避开不需要替换的部分。
问题分析
你原来的正则/(4)/gi会全局匹配所有数字4,自然也会命中属性值里的4。咱们需要给匹配规则加上“排除条件”:只匹配那些不在data-value="和闭合双引号之间的4。
解决方案代码
直接用下面的正则替换即可:
const str = 'Hello this is string <sfpart contenteditable="false" data-value="4">‏</sfpart> and the 4 number in string'; const reg = new RegExp('(?<!data-value=")4(?!")', 'gi'); const updatedStr = str.replaceAll(reg, '<span class="yellow">$&</span>');
正则规则解释
咱们拆解一下这个正则的各个部分:
(?<!data-value="):负向后行断言,确保当前要匹配的4,前面不是data-value="这个字符串4:我们要定位的目标数字(?!"):负向前行断言,确保当前要匹配的4,后面不是闭合的双引号gi:全局+不区分大小写(这里大小写不影响,但保留全局匹配很重要)
替换后的结果会是:
Hello this is string
and the 4 number in string
可以看到,data-value="4"里的4完全没被改动,只有字符串里的独立4被替换成了带黄色样式的span。
扩展说明
如果之后需要避开更多类似属性(比如data-id="4"),只需要调整负向后行断言的内容,比如改成(?<!data-value="|data-id=")就行,灵活度很高。
内容的提问来源于stack exchange,提问作者Michael Fine
相关产品推荐
相关产品推荐

