当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 常用工具方法
分享到: 
收藏 +0
1
网上有很多相似的方法,但发现都不能处理如下情况:
var test = "http://test";
var test = "/*test*/"

后来看了一个boost官方的例子,把C++文件输出为高亮的html:
http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/ref/regex_replace.html

写出如下可以支持("/**/", "// ")的去除注释方法

代码片段(1) [全屏查看所有代码]

1. [代码]cpp代码     跳至 [1] [全屏预览]

void CleanComment(string& str)
{
	string& szStr = str;
	string szReg = "('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|" //跳过" "/' '部分
								"(?<comment>//[^\\n]*|/\\*.*?\\*/)"; //单行注释,多行注释
	string::const_iterator start = szStr.begin(), end = szStr.end(); 
	size_t pos,num;
	boost::regex reg(szReg);
	boost::smatch match;
	boost::match_flag_type flags = boost::match_default; 
	while(regex_search(start, end, match, reg, flags)) 
	{
		pos =  match[0].first- szStr.begin();
		num = match[0].second-match[0].first;

		if(match["comment"].matched)
		{
			szStr.erase(pos, num);
			// update search position: 
			start = szStr.begin() + pos;
		}
		else
		{
			// update search position: 
			start = match[0].second;
		}

		end = szStr.end();//重要,此时字符串已经被改变,需要重新获得新的end()
		// update flags: 
		if(start != szStr.begin())
		{
			flags |= boost::match_prev_avail; 
			flags |= boost::match_not_bob;
		}
	}
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(1)

  • 1楼:RyanLee 发表于 2010-11-04 13:33 回复此评论
    去除多余空行的正则
    "^[\\s]*\\n"
开源从代码分享开始 分享代码
RyanLee的其它代码 全部(9)...