C++正则表达式使用实例--实现一个markdown代码标记转换工具
来源:互联网 发布:大数据项目知识点 编辑:程序博客网 时间:2024/05/21 07:48
前言
这个需求起源于github官方升级了Jekyll引擎到3.0,markdown引擎受到了一定的影响,比如代表标记由原来的
```c++```
变成了{%highlight c++%} {%endhighlight%}
如果不进行转换的话,那么原来博客里的代码片段排版将会发生错误:失去高亮,且布局错乱。
这个问题本质上就是字符串的替换,应该有很多现成的工具可以完成这个任务,或者我可以直接在.vimrc
中添加一个命令,实现一键替换当前文件中的代码标记。
我习惯于抓住任何可以实践c++的机会,因此第一想法就是使用c++来做这个功能,虽然它并不是最好的选择。
准备工作:掌握c++正则表达式基本用法
代码实现
size_t convertHighlight(vector<string>& content, char* cmd) { string patternBegin; string patternEnd; regex regexBegin; regex regexEnd; string replaceBegin; string replaceEnd; if (string(cmd) == "--to-dot") { // match {% highlight <lan> %} and {% endhighlight %}, then replace with ```<lan> and ```. patternBegin = "[\\s\\t]*\\{[\\s\\t]*%[\\s\\t]*\\bhighlight[\\s\\t]*(\\S+)[\\s\\t]*%[\\s\\t]*\\}[\\s\\t]*"; regexBegin = patternBegin; patternEnd = "[\\s\\t]*\\{[\\s\\t]*%[\\s\\t]*endhighlight[\\s\\t]*%[\\s\\t]*\\}"; regexEnd = patternEnd; replaceBegin = "```$1"; replaceEnd = "```"; } else { // match ```<lan> and ```, then replace with {% highlight <lan> %} and {% endhighlight %}. patternBegin = "[\\s\\t]*```(\\S+)[\\s\\t]*"; regexBegin = patternBegin; patternEnd = "[\\s\\t]*```[\\s\\t]*"; regexEnd = patternEnd; replaceBegin = "{% highlight $1 %}"; replaceEnd = "{% endhighlight %}"; } // check every line, try to match begin and end. vector<string> backup; backup.swap(content); size_t matchCount(0); for (auto & line : backup) { smatch sm; // try to match begin. regex_match(line, sm, regexBegin); if (sm.size() == 2) { cout << "replace: " << line << endl; line = regex_replace(line, regexBegin, replaceBegin); ++matchCount; continue; } regex_match(line, sm, regexEnd); if (sm.size() == 1) { cout << "replace: " << line << endl; line = regex_replace(line, regexEnd, replaceEnd); ++matchCount; } } cout << "================ total replace: " << matchCount << "================ " << endl; if (matchCount > 0) { // write back to contents. content.swap(backup); } return matchCount;}
参考链接
作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问
1 0
- C++正则表达式使用实例--实现一个markdown代码标记转换工具
- C实例---实现一个简单的正则表达式(删除重复的字符)
- Markdown标记语言语法及使用实例
- 正则表达式使用实例
- java正则表达式语法详解及其使用代码实例
- java正则表达式语法详解及其使用代码实例
- java正则表达式语法详解及其使用代码实例
- java正则表达式语法详解及其使用代码实例
- java正则表达式语法详解及其使用代码实例
- 使用C#的正则表达式验证中文字符(实例代码)
- IOS使用第三方工具(RegexKitLite)实现正则表达式
- IOS使用第三方工具(RegexKitLite)实现正则表达式
- iOS使用第三方工具(RegexKitLite)实现正则表达式
- java正则表达式---使用实例
- [原创代码]用正则表达式剔除文本中的HTML标记
- Java正则表达式工具类实例
- 正则表达式获取HTML标记中的内容(C#)
- 正则表达式获取HTML标记中的内容(C#)
- Xvid视频编解码算法
- 为了caffe(四)学习人家的文章
- selenium 2.44安装测试教程(附全程免费资料软件包下载)
- NVIDIA Jetson TK1学习与开发——安装cuda和opencv
- codeforces 711D. Directed Roads 找环
- C++正则表达式使用实例--实现一个markdown代码标记转换工具
- ReplaceBlank
- translate函数的用法
- 链表的排序
- POJ 3304 直线与线段相交的判断
- Google APAC 2017 University Test Round B
- LeetCode练习与总结
- iOS基础知识点
- 文章标题