【问题标题】:Replace without Boost更换不升压
【发布时间】:2012-12-21 20:54:01
【问题描述】:

我必须从文本中去除一些 XML 标记并保留它们的值。

例子

text text <tag>tag_value</tag> text text <a href="example.com">example.com</a>
->
text text tag_value text text example.com

到目前为止,我使用了 boost_replace,但现在我无法使用该库。

std::string src(text);
std::string fmt ="";
std::string ex = "(<tag attribute=\"(.*?)\">)|(</tag>)|(<a href(.*?)\">)|(</a>)|(<tag>)|(</tag>))";
boost::regex expr(ex);
std::string s2 = boost::regex_replace(src, expr, fmt, boost::match_default | boost::format_all);

我该如何解决这个问题?哪个图书馆可以帮助我做到这一点?谢谢

【问题讨论】:

  • 如果您不能使用 Boost,您选择库的标准是什么(例如哪些库也是不可接受的)?
  • 只是“轻量级”是可以接受的
  • Boost 有什么不可接受的地方?在最终的可执行文件中,您将只拥有您实际使用的 Boost 部分,这是您真正应该关心的全部。您不必让任何用户下载超过 600 MB 的文件,以便他们拥有“所有的 Boost”。
  • 公平地说,我的工作场所也禁止了 Boost,因为它“不是轻量级的”。当您在一个单一的捆绑包中分发这么多资源并且不容易分离时,这很容易获得声誉。

标签: c++ xml replace tags strip


【解决方案1】:

永远不要使用正则表达式来解析 XML!

RegEx match open tags except XHTML self-contained tags

您需要一个真正的 XML 库,例如 expat 或 libxml2。

【讨论】:

  • 问题是关于剥离标签没有任何进一步处理。这里可以使用正则表达式。
  • 它仍然相关。在那里扔一个&lt;[[CDATA 或一个&lt;!-- 评论块并观察正则表达式崩溃。
  • 好吧,没有简单的正则表达式解决方案用于剥离,但是,我仍然认为使用成熟的解析器here有点过头了。
  • OP 没有说明 XML 是否来自已知的可信来源。所以我们必须假设 XML 可能来自任何地方,并且可能包含我们不期望的东西。如果您完全控制 XML,从生成到解析,并且我们可以在解析器中不完全兼容 XML,那么当然,我们可以妥协。但老实说,为什么推荐半途而废的方法呢?让我们做对吧。
  • 顺便提一下,与此对应的 boost::spirit 是 boost::spirit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多