如何让多行正则匹配模式变为非贪婪?匹配自闭合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>标签,排除中间那个非自闭合的标签。
原有正则的问题
你用的两个正则都存在缺陷:
- 贪婪版本
<SomeXmlProperty((.| | )*)/>:会从第一个<SomeXmlProperty开始,一直匹配到最后一个/>,直接把中间的非自闭合标签也包含进去,完全不符合需求。 - 非贪婪版本
<SomeXmlProperty((.| | )*?)/>:虽然用了非贪婪匹配,但没有限制中间内容不能出现其他<SomeXmlProperty标签或单独的>,导致它会跨过非自闭合标签的>,继续往后找第一个/>,最终还是会错误包含部分非目标内容。
正确的正则表达式
要精准匹配自闭合标签,需要通过负前瞻限制中间内容的范围,避免跨标签或匹配到非自闭合结构:
<SomeXmlProperty(?:(?!<SomeXmlProperty|>)[\s\S])*?/>
正则解释
(?:...):非捕获组,仅用于分组逻辑,不额外捕获内容(?!<SomeXmlProperty|>):负前瞻断言,确保当前位置后不会出现新的<SomeXmlProperty标签或普通闭合的>,从根源上避免跨标签匹配[\s\S]:匹配任意字符(包括换行,比.|\n|\r更简洁通用)*?:非贪婪匹配,确保遇到第一个符合条件的/>就停止,避免过度匹配
内容的提问来源于stack exchange,提问作者Woody
相关产品推荐
相关产品推荐

