题目
思路
主要为正则表达式的应用,例如:
无序列表的正则表达式为:^\\* +(.*),按题意将其替换为:<li>$1</li>,$1代表前面捕获的分组也就是(.*)中的内容下面同理,,具体看代码注释。
实现代码
#include<bits/stdc++.h>
using namespace std;
vector<pair<regex,string>> rs = {{regex("^\\* +(.*)"),"<li>$1</li>"},//无序列表
{regex("_([^_]+)_"),"<em>$1</em>"},//强调
{regex("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"),"<a href=\"$2\">$1</a>"}};//超级链接
int main(){
vector<vector<string>> mark(1);//存放输入文档
for(int i = 1;i<=6;i++)
rs.push_back({regex("^"+string(i,'#')+" +(.*)"),"<h"+to_string(i)+">$1</h"+to_string(i)+">"});//6种标题
string s = "";
while(getline(cin,s)){
if(s=="") mark.push_back({});//如果区块为空,存入空区块
else mark.back().push_back(s);//否则,按行存入当前区块
}
for(auto &i:mark){//遍历区块
if(i.empty()) continue;
int type = i[0][0]=='*'?1:i[0][0]=='#'?2:3;//分别为列表、标题、段落
printf("%s",type==1?"<ul>\n":type==3?"<p>":"");//按类别输出
for(int j = 0;j<i.size();j++){//遍历区块中的内容
for(auto &k:rs)//遍历匹配规则并替换
i[j] = regex_replace(i[j],k.first,k.second);
printf("%s%s",i[j].c_str(),j==i.size()-1?"":"\n");
}
printf("%s%s",type==1?"\n</ul>":type==3?"</p>":"","\n");
}
return 0;
}