以前研究过,这样的文本其实不是太容易匹配。
一般的 * 量词都是贪心的,就是尽量多的匹配东西。如果使用的正是引擎支持憜性匹配量词(比如 perl 中的 *? 或者 vim 中的 \{-}),或者说是尽量少的匹配东西,也许可以考虑用 <tag>.*?<tag> 来匹配。
但是它对下面这类嵌套的文本不太好用:
<tag>abc<tag>def</tag>ghi</tag>
它会匹配红色的部分,但这可能不是我们想要的。
另一种方法得用诸如 perl 中的 (?=...) 或者 (?!...) 这样的表达式(在 vim 中是 \@= 和 \@!,虽然可读性好像差一点。)来匹配。不一定所有的正则引擎都支持这些功能。
不建议楼主用 c++ 做这种小东西。用用其它工具,可能更方便一点。