正则表达式匹配标签xml标签问题?

需要在xml根据关键字定位,然后匹配位置附件的某个标签,如:
根据一下代码中,开始定位第一个'w:tbl'标签,然后匹配针对'w:tbl'中的内容。

开始
<w:tbl>.......</w:tbl>
这是一个测试
<w:tbl>......</w:tbl>
测试2
结束

使用的正则表达式为:开始.+<(w:tbl)>.*<\/\1> ,却总是为会匹配到第二个w:tbl结束。
clipboard.png
怎样修正,可以只匹配到第一个w:tbl,即:

clipboard.png
谢谢。

阅读 12.8k
3 个回答

请使用非贪婪模式
开始.+<(w:tbl)>.*?<\/\1>
另外,既然是xml文件,建议使用解析xml的方法来解决问题。

UPDATE::=========
看到了题主自己的答案了,我疏忽了。

这里我想给出另外一种答案:
开始[^<]*<(w:tbl)>[^<]*<\/\1>

UPDATE::=========
对于题主的答案,还是存在问题
开始.*?<(w:tbl)>.*<\/\1>
后面的<(w:tbl)>.*<\/\1>没有做约束,还是会匹配到

<w:tbl>.......</w:tbl>
这是一个测试
<w:tbl>......</w:tbl>

这些行

用正则处理XML/JSON是一个必须一棍打死的想法。题主的问题就是不可回答的。

这个问题有一个语义学的解释(XML/JSON等的语义更为高阶,正则的语义级别不足以解释),但我不太会详细展开这一点。

就算不谈语义学,用正则解析XML也无法覆盖格式略有不同但确实100%合法的XML,违反了程序对输入输出格式宽进严出的原则。例如以下任何一行的XML,正则表达式如之奈何?

<w:tbl property1="value1"></w:tbl >
<w:tbl></w:tbl >
<!-- <w:tbl></w:tbl> -->

自问自答:@Honwhy 同学答的是对的。我开始反复测试了很多次,开始.+<(w:tbl)>.*?<\/\1> 这个非贪婪模式,都不起作用,依然会匹配到第二个结束标签。最后使用Regex Match Tracer,进行调试,原来问题出在第一个.+ 这里。这个是贪婪模式,直接匹配到第二个标签结束,导致后面的非贪婪模式也不起作用。

修改为
开始.*?<(w:tbl)>.*?<\/\1>这样就可以了。

谢谢@Honwhy 同学。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进