寻找匹配非HTML属性中特定字符串的正则表达式
匹配HTML文本中不在属性内的特定字符串
问题场景
给定包含HTML元素的字符串:
<a href="something+specific_string" title="testing">This is a text and "specific_string"</a>
需要编写正则表达式,仅匹配不在HTML属性值内的specific_string。当前使用的正则((?!\"[\w\s]*)specific_string(?![\w\s]*\"))存在误判:当目标字符串被文本内容里的双引号包裹时,会错误地排除该匹配。
解决方案
使用以下正则表达式可以解决该问题:
specific_string(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^<]*>)
正则原理
(?=(?:[^"]*"[^"]*")*[^"]*$):通过正向预查统计当前位置到字符串末尾的引号数量,确保为偶数——这意味着当前位置不在未闭合的属性引号范围内。(?![^<]*>):通过负向预查确保当前位置不在HTML标签内部(即从当前位置到下一个>之间没有<,说明处于标签外的文本区域)。
效果验证
在示例字符串中,该正则会精准匹配文本内容里的specific_string,完全忽略href属性值内的同名字符串,同时不会误判文本中被双引号包裹的目标字符串。
内容的提问来源于stack exchange,提问作者Lucas Besen
相关产品推荐
相关产品推荐

