正则表达式匹配XML节点
通过这则表达式匹配一下xml文件中parent节点
<xml>
? ? <parent id="parent1"/>
? ? <parent id="parent2">
? ? ? ? <child name="child1"/>
? ? </parent>
? ? <parent id="parent3">
? ? ? ? <child name="child1"/>
? ? </parent>
<xml>
正则表达式的为:<parent[^>]*?(?=/>|>)(/>|>(?<!/>)(\S|\s)*?</parent>)
简单说明一下
第一步
通过:<parent[^>]*?(?=/>|>)的用处是尽可能多的匹配单一节点和有子节点的parent最大内容这里可以匹配到每一行的引号部分.通过正向肯定预查(?=/>|>)来确保查询parent1的时候不含后面的斜杠(/),加上这个只是为了容易理解匹配起来该觉比较整齐.
第二步
通过或(|)来匹配两种形式如果类似parent1的节点直接通过/>匹配余下的两个字符,如果含有child节点,在首先补上>,然后通过反向否定预查(?<!/>)确保前面的>是"<parent
id="parent2">"中的>而不是"/>"中的>,也就是后面的表达式匹配parent2以后的内容,其中(\S|\s)*?以非贪婪的形式匹配</parent>之前的内容,若果贪婪的方式则会匹配到parent3的</parent>.
仅仅通过这个例子来学习正则表达式的预查使用实际表达式可以简化为 :?<parent[^>]*(/>|>(\S|\s)*?</parent>)