如何用正则匹配不含att2的<tag>标签?避免过度捕获
解决XML标签的正则匹配问题
要精准匹配仅包含att1属性的<tag/>标签(Case1),同时排除包含att1和att2的标签(Case2),可以调整负向预查的位置和范围,使用以下正则表达式:
<tag att1="(.*?)"(?!\s+att2=".*?")\s*/>
正则各部分说明:
<tag att1="(.*?)":匹配标签开头与att1属性,通过非贪婪模式.*?捕获att1的属性值,避免过度匹配。(?!\s+att2=".*?"):负向预查,确保att1属性结束后,不会紧接着出现带空格的att2属性结构,直接排除Case2的标签。\s*/>:匹配标签结束前可能存在的任意空格,兼容XML格式中允许的空格书写习惯。
为什么之前的正则失效?
你之前的负向预查范围错误,直接检查后续是否是完整的 att2="..."/>,但这种写法会忽略att1与att2之间可能存在的空格差异,或者预查的位置没有覆盖到标签结束前的所有区域,导致过度捕获或漏判。
内容的提问来源于stack exchange,提问作者Bobkitty
相关产品推荐
相关产品推荐

