- 起因
a) 工作中需要解析html ,由于现有的html解析代码过于老旧,不满足可读性,复用性,维护性三个编程要求。意味着,html解析模块一旦出了问题,修复时间长,人力耗费高。而对于系统,html解析的需求是长期存在的,需要有一套可复用,高效,模块化方法来解析。正则表达式解析正是这样一个尝试方向。
- 正则表达式解析举例
a) 删除特定标签:
删除<xxx>类型的标签:
#include "boost/regex.hpp" string str_replace = ""; string instr = "<tag>content</tag>"; boost::regex reg_del( "<[^>]*>" ); string result = boost::regex_replace(instr, reg_del, str_replace, boost::match_default | boost::format_all);
result的值为 “content”
删除<style>xxx</style>:
#include "boost/regex.hpp" string str_replace = ""; string instr = "<a><style>content</style><b>"; boost::regex reg_del2( "<style[^>]*>[^>]*</style>" ); string result = boost::regex_replace(instr, reg_del2, str_replace, boost::match_default | boost::format_all);
result的值为 “<a><b>”
#include "boost/regex.hpp" std::string text("<a color=green>content1</a><b color=blue>content2</b>"); boost::regex regex("<[^>]*color[^>]*>"); boost::sregex_token_iterator iter(text.begin(), text.end(), regex, 0); boost::sregex_token_iterator end; for (; iter != end; ++iter) {std::cout << *iter << '\n';}
程序输出为:
<a color=green>
<b color=blue>
- 使用正则表达式做解析优劣
a) 好处
i. 代码简洁短小, 减少维护压力。
b) 坏处
i. 正则表达式入门成本高
ii. 不懂正则的人读不懂,要靠注释说明。
- 正则表达式资料
a) 简单的入门其实不难,一些简单的网站介绍几本可以大概了解。
b) 正则用法广泛,不必追求全懂,知道可能会有写法,一边查资料, 一边测试效果更快。
c) 测试工具推荐使用 RegexBuddy, 用法简单, 网上也有blog教用。用此工具可以快速看到正则的效果是不是需要的(如下图)。