游戏人生
首页
(current)
GameDevTools
登陆
|
注册
个人中心
注销
C# 基础教程
C# 教程
C# 简介
C# 与.net
C# 开发工具
C# 程序结构
C# 基本语法
C# 数据类型
C# 类型转换
C# 变量
C# 常量
C# 运算符
C# 判断
C# 循环
C# 封装
C# 方法
C# 可空类型(Nullable)
C# 数组(Array)
C# 字符串(string)
C# 结构体(Struct)
C# 枚举(Enum)
C# 类(Class)
C# 继承
C# 多态
C# 运算符重载
C# 接口(Interface)
C# 命名空间(Namespace)
C# 预处理器指令
C# 正则表达式
C# 异常处理
C# 文件的输入与输出
C# 高级教程
C# 特性(Attribute)
C# 反射(Reflection)
C# 属性(Property)
C# 索引器(Indexer)
C# 委托(Delegate)
C# 事件(Event)
C# 集合(Collection)
C# 泛型(Generic)
C# 匿名方法
C# 不安全代码
C# 多线程
C# 实例
C# 正则表达式实例(1)-fprintf立即刷新
<< C# 教程
C# 与.net >>
C# 正则表达式实例(1)-fprintf立即刷新
C语言中,`fprintf` 写入字符串到文件,实际上是写入到缓冲区,而不是立即写入到文件里。 在学习别人代码时,想要立即看到代码效果,就需要立即刷新到文件里。 但是 `fprintf`是没有这种设置的,只能写到缓冲区。 于是只能在 `fprintf` 后,再跟上 `fflush` 立即写入到文件里。 --- 手上的项目里,搜索一下,几千个 `fprintf`,手动替换是不可能了,于是写个小公举,用正则语法,进行替换。 主要用到了正则的识别、提取,代码如下: ```csharp using System; using System.Collections.Generic; using System.Collections; using System.IO; using System.Text.RegularExpressions; namespace CheckModle { class Program { static void Main(string[] args) { string tmpDirPath="/home/administrator/Documents/citcompiler/"; string[] tmpFilePathArray=Directory.GetFiles(tmpDirPath,"*.cpp",SearchOption.AllDirectories); foreach (var tmpFilePath in tmpFilePathArray) { //string tmpFilePath="/home/administrator/Documents/citcompiler/generator.cpp"; string[] tmpLineStrArr=File.ReadAllLines(tmpFilePath); string tmpFileNameStr=Path.GetFileNameWithoutExtension(tmpFilePath); Console.WriteLine(tmpFileNameStr); for(int tmpIndex=0;tmpIndex<tmpLineStrArr.Length;tmpIndex++) { string tmpLineStr=tmpLineStrArr[tmpIndex]; if(tmpLineStr.IndexOf("fflush(")>=0) { continue; } //string pattern = @"\s*end\s*"; string pattern = @"\s*fprintf\s*\(\s*.*,.*\)\s*;"; Regex rgx = new Regex(pattern); if(rgx.IsMatch(tmpLineStr)) { Console.WriteLine("match :"+tmpLineStr+" line:"+tmpIndex); //提取 fprintf 目标 pattern = @"((.*)fprintf\s*\((\w+),.*\)\s*;)(.*)"; rgx = new Regex(pattern); GroupCollection result = rgx.Match(tmpLineStr).Groups; foreach(var item in result) { Console.WriteLine("pickup:"+item); } if(result.Count==5) { string tmpBeginPartStr=result[1].Value; string tmpTabStr=result[2].Value; string tmpName=result[3].Value; string tmpAnnotation=result[4].Value; string tmpNewLineStr=tmpTabStr+"{\n\t"+tmpBeginPartStr+"fflush("+tmpName+");"+tmpAnnotation+"\n"+tmpTabStr+"}"; Console.WriteLine(tmpNewLineStr); tmpLineStrArr[tmpIndex]=tmpNewLineStr; } } } File.WriteAllLines(tmpFilePath,tmpLineStrArr); } } } } ``` 例如原来的代码是这样的: ```csharp if(p_factor2->localAddr<0) fprintf(fout,"\tmov ebx,[ebp%d]\n\tmov eax,0\n\tmov al,[ebx]\n",p_factor2->localAddr);fflush(fout); else fprintf(fout,"\tmov ebx,[ebp+%d]\n\tmov eax,0\n\tmov al,[ebx]\n",p_factor2->localAddr);fflush(fout); ``` 替换后代码为: ```csharp if(p_factor2->localAddr<0) { fprintf(fout,"\tmov ebx,[ebp%d]\n\tmov eax,0\n\tmov al,[ebx]\n",p_factor2->localAddr);fflush(fout); } else { fprintf(fout,"\tmov ebx,[ebp+%d]\n\tmov eax,0\n\tmov al,[ebx]\n",p_factor2->localAddr);fflush(fout); } ``` 主要修改两个地方: - 在原来的`fprintf`代码后面添加 `fflush`语句。 - 在`fprintf`这一行上下添加大括号。 用到的知识点: - \s* 0个或多个空格 - .* 0个或多个任意字符 - \w+ 一个或多个单词 - (\w+) 提取一个或多个单词 - () 提取括号里的内容
<< C# 教程
C# 与.net >>
提交
5e6074d32de88f4e9f9a4638