正则表达式匹配打开和关闭标记以及该标记内的某些文本模式

时间:2011-06-16 08:07:14

标签: xml regex

以下是我从sitemap.xml

获取的示例自定义标记
<url>
  <loc>http://sitename.com/programming/php/?C=D;O=A</loc>
  <changefreq>weekly</changefreq>
  <priority>0.64</priority>
</url>

有很多这样的条目,如果你看到loc标签,它有c = d; 0 = a结尾。 我想删除所有以<url>开头的条目,以</url>结尾,其中包含C = D; 0 = A或类似的模式。

以下表达式与整个上述指定标记

匹配
<url>(.|\r\n)*?<\/url>

但我希望像上面声明中指定的那样匹配。

我们如何形成正则表达式来匹配这些条件(模式)?

3 个答案:

答案 0 :(得分:11)

试试这个:

/<url>(?:(?!<\/url>).)*C=D;O=A.*?<\/url>/m

负向前瞻保证您不匹配多个节点。

见这里:rubular

答案 1 :(得分:6)

将正则表达式用于XML并不是一个好主意。根据您应使用某些XML阅读器的语言,提取<url>节点,然后使用正则表达式匹配节点的内容。 许多XML库支持的一种用于查询XML数据的有用语言是XPath

答案 2 :(得分:0)

如果你绝对必须使用正则表达式,那么这个:

<([a-z][a-z0-9]*)\b[^>]*>(.*?)(C=D;O=A){1}(.*?)</\1>

会让你上线:

  

http://sitename.com/programming/php/?C=D;O=A

然后我会遍历到父标签并用它做任何我想做的事。