当前位置: 首页 > news >正文

批量去掉 C++/C 中的注释

经常打开以前写的代码要作为作业提交的时候发现要么中文注释变成乱码了,要么之前的注释过于详细导致影响正常阅读了。。。。

总之就是想删去注释清爽一下的时候。。。百行以内的手工操作还好说,再长一些的就很累人了,而且程序解决一定又快有好。

 

由于这个问题显然是文件IO+字符串操作,所以用python来做会好一些,主要使用的是re模块,即使用正则表达式。

 

1. 将文件逐行读入并连接成一个字符串(过长的文件应该选择逐块进行,但这时候块注释需要设定一个标记,否则不知道当前行是块注释内部还是外部);

2. 写两个识别注释的pattern然后将匹配到的字符串替换为空串即可。

 

简易的版本大概就是这样,核心就是正则表达式的匹配和替换,十分简单:


 2 import os
 3 import re
 4 
 5 hasBlockComment=False
 6 
 7 def parse(string):
 8     pattern1=re.compile(r'//.*')
 9     result = re.sub(pattern1, "", string)
10 
11     pattern2=re.compile(r'(/\*)((\*[^/])*|([^\*])*)(\*/)')
12     result=re.sub(pattern2,"",result)
13 
14     return result
15 
16 
17 def main():
18     fileName=input("input file path and name:")
19     name,ext=os.path.splitext(fileName)
20     file=open(fileName,"r")
21     result=open("result.txt","w")
22 
23     content=""
24     for eachline in file:
25         content+=eachline
26     l=(str)(parse(content))
27     result.write(l)
28 main()


针对很大的文件,我们需要找到第一个/* 之后记录它的行数和位置,然后再之后的读取中遇到 */的时候将之间的内容全部删除,由于C++ / C 的注释不能嵌套,所以比如

/* ... /* .... */ 应该是首尾的进行匹配而不是第二个和末尾匹配。

当然自己用的话,注释应该是不会嵌套的。

用C++ 来做的话也很简单,不调用一些库函数的话,可以人工模拟一个简易的状态机,逐个进行读入字符,遇到/*的时候记录位置,继续不断读入,知道遇到*/ ,标记这个位置,输出的时候忽略这一段的内容,行注释的话十分简单,没有上下文的干扰,不再赘述了。


之前python 做的scheme解释器玩腻了的时候可以将关键词换成中文的,当然就是玩玩了,没有任何意义。。。

效果就是下面这样子。。。果然太无聊了,为了输入方便还刻意将英文的()换成()。。。

http://user.qzone.qq.com/414445050/blog/1416846214

转载于:https://www.cnblogs.com/gaoduan/p/4139847.html

相关文章:

  • 为什么memset不能将数组元素初始化为1?
  • ia64和X86
  • linux python 更新版本
  • Sublime Python 插件配置合集
  • syslogd klogd
  • 设计模式——装饰者模式
  • c语言的作用域、变量与结构体
  • 关于终端和控制台的一些解释
  • 从源码编译新版OGRE 1.7.2 [Cthugha] for iphone/ipad
  • VS2010 添加服务引用以后点不出引用服务的命名空间
  • 查找触发器
  • Android中的PopupWindow详解
  • 怎么使用response.write来做一个javascript的alert弹出窗口
  • 堆栈指针理解
  • Json的引入
  • [deviceone开发]-do_Webview的基本示例
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CSS 专业技巧
  • Fabric架构演变之路
  • Flannel解读
  • JavaScript-Array类型
  • JAVA多线程机制解析-volatilesynchronized
  • JS函数式编程 数组部分风格 ES6版
  • JS基础之数据类型、对象、原型、原型链、继承
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 测试如何在敏捷团队中工作?
  • 初识 webpack
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 使用putty远程连接linux
  • 算法之不定期更新(一)(2018-04-12)
  • 新版博客前端前瞻
  • 追踪解析 FutureTask 源码
  • 最简单的无缝轮播
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 组复制官方翻译九、Group Replication Technical Details
  • ​决定德拉瓦州地区版图的关键历史事件
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (8)STL算法之替换
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (转)fock函数详解
  • (转)母版页和相对路径
  • ***测试-HTTP方法
  • .cfg\.dat\.mak(持续补充)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net 4.0发布后不能正常显示图片问题
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net接口调试与案例
  • .NET微信公众号开发-2.0创建自定义菜单