如有以下模板文本(其中用一对标记{{}}标识用于查找和替换的文本):
<!DOc++TYPE html><html><head><title>User {{name}}</title></head><body><h3>{{name}}</h3><p>Email:<ahref="mailto:{{email}}">{{email}}</a></p><p>Address:{{address}}</p></body></html>对标记{{var}}内的文本按其内的标识名var批量处理。
用于查找、替换的文本:
name "wwu"email "wwuhn@163.com"要处理为:
<!DOCTYPE html><html><head><title>User wwu</title></head><body><h3>wwu</h3><p>Email:<ahref="mailto:wwuhn@163.com">wwuhn@163.com</a></p><p>Address:</p></body></html>编程思路:
目标文本用vector<string>content存放。
替换文本用map<string,string>findReplace存放。
然后扫描content,查找形如{{var}}的字符串,将其用findReplace[var]替换。
字符串的查找替换使用string类的成员函数find()和replace()完成。
#include <iostream>#include <vector>#include <string>#include <map>using namespace std;vector<string> content; // 包括需要替换内容的文本(需要替换的内容用{{}}标识关键字)map<string,string> findReplace; // 需要替换的关键字和目标替换内容int textLines,keys; // 目标处理文本和用于替换的文本的行数void trans(){ // 网页转换 for(int i=0; i<textLines; i++) // 逐行处理 { int pos=0,pos1,pos2; do{ pos1=content[i].find("{{",pos); pos2=content[i].find("}}",pos1); if(pos1>=0 && pos2>=0){ // 找到 {{ }} string var = content[i].substr(pos1+2,pos2-pos1-2); if(findReplace.count(var)){ // 提取形如 {{var}}的内容 string result=findReplace[var].substr(2,findReplace[var].length()-3); content[i].replace(pos1,var.length()+4,result); } else content[i].replace(pos1,var.length()+4,""); pos = pos1+var.length(); } else // 没有打到{{ }},pos指向当前字符串末尾 pos = content[i].length(); }while(pos<content[i].length()); }}int main(){ int i=1; string line; cin>>textLines>>keys; cin.ignore(); // 屏蔽回车键 for(i=0;i<textLines;i++){ getline(cin,line); content.push_back(line); }for(i=0;i<keys;i++){ getline(cin,line); int pos = line.find(" "); findReplace.insert(map<string,string>::value_type(line.substr(0,pos),line.substr(pos))); } trans(); for(i=0;i<textLines;i++) cout<<content[i]<<endl; restart: goto restart; return 0;}/*12 2<!DOCTYPE html><html><head><title>User {{name}}</title></head><body><h3>{{name}}</h3><p>Email:<ahref="mailto:{{email}}">{{email}}</a></p><p>Address:{{address}}</p></body></html>name "wwu"email "wwuhn@163.com"*/测试时,可直接复制粘贴以上备注内容。
适当改写,模板文本可以放到文本文件,再读取到content中。
当然,也可用到图形界面的文本处理中。
res:
李春葆 李筱《直击招聘 程序员面试笔记 算法设计深度解析》
-End-