You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让多行正则匹配模式变为非贪婪?匹配自闭合XML标签遇问题

正则匹配XML自闭合标签的问题解决

目标匹配内容

给定XML片段:

<SomeXmlProperty att="abc" 
att2="def"
att3="ghi"/>
<SomeXmlProperty att4="jkl" 
att5="mno"
att6="pqr"><SomeXmlProperty>
<SomeXmlProperty att="stu" 
att3="vwx"
att6="yz"   
/>

需要精准匹配其中所有自闭合的<SomeXmlProperty>标签,排除中间那个非自闭合的标签。

原有正则的问题

你用的两个正则都存在缺陷:

  1. 贪婪版本<SomeXmlProperty((.| | )*)/>:会从第一个<SomeXmlProperty开始,一直匹配到最后一个/>,直接把中间的非自闭合标签也包含进去,完全不符合需求。
  2. 非贪婪版本<SomeXmlProperty((.| | )*?)/>:虽然用了非贪婪匹配,但没有限制中间内容不能出现其他<SomeXmlProperty标签或单独的>,导致它会跨过非自闭合标签的>,继续往后找第一个/>,最终还是会错误包含部分非目标内容。

正确的正则表达式

要精准匹配自闭合标签,需要通过负前瞻限制中间内容的范围,避免跨标签或匹配到非自闭合结构:

<SomeXmlProperty(?:(?!<SomeXmlProperty|>)[\s\S])*?/>

正则解释

  • (?:...):非捕获组,仅用于分组逻辑,不额外捕获内容
  • (?!<SomeXmlProperty|>):负前瞻断言,确保当前位置后不会出现新的<SomeXmlProperty标签或普通闭合的>,从根源上避免跨标签匹配
  • [\s\S]:匹配任意字符(包括换行,比.|\n|\r更简洁通用)
  • *?:非贪婪匹配,确保遇到第一个符合条件的/>就停止,避免过度匹配

内容的提问来源于stack exchange,提问作者Woody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:31:03