如何编写PCRE2正则表达式匹配含<B>255</B>的<Item>元素
匹配包含- 元素的PCRE2正则解决方案
的return (<B>255</B>)
要精准选中XML里包含<B>255</B>子元素的<Item>...</Item>元素,之前尝试的<Item(.|\n)*?<B>255</B>(.|\n)*?</Item>存在匹配范围失控的问题——要么匹配不到目标内容,要么会错误覆盖多个<Item>(比如会把<Item KID="2">到<Item KID="7">的所有内容连在一起匹配)。
示例XML
<?xml version="1.0" encoding="UTF-8"?> <Favourites> <Buttons> <Item KID="1"> <ButtonColor> <R>255</R> <G>255</G> <B>255</B> </ButtonColor> </Item> <Item KID="2"> </Item> <Item KID="3"> <ButtonColor> <R>239</R> <G>235</G> <B>233</B> </ButtonColor> </Item> <Item KID="7"> <ButtonColor> <R>255</R> <G>255</G> <B>255</B> </ButtonColor> </Item> </Buttons> </Favourites>
正确的PCRE2正则表达式
<Item(?:(?!<Item|</Item>|<B>255</B>).)*<B>255</B>(?:(?!<Item|</Item>).)*</Item>
正则逻辑说明
<Item:锚定目标元素的起始标识(?:(?!<Item|</Item>|<B>255</B>).)*:非捕获组搭配负向前瞻,确保在找到<B>255</B>之前,每一个字符都不会触发<Item、</Item>或目标子元素的开头,彻底避免跨越其他<Item>标签<B>255</B>:精准匹配需要的子元素(?:(?!<Item|</Item>).)*:同样用负向前瞻限制,确保从目标子元素到</Item>之间的内容不会溢出到其他<Item>中</Item>:锚定元素的结束标识
内容的提问来源于stack exchange,提问作者Ranudar
相关产品推荐
相关产品推荐

