本来这个功能应该算是编辑器的一个附属功能,本来有一个JS的代码着色器(syntaxhighlighter),现在版本是1.51,但是由于其功能始终是客户端的,有一些服务器操作比较麻烦,于是自己写了一个,当前只是实现了C#版本。
在这里,我讲述一下该代码实现模式,这里主要讲讲循环和分组的机制
主体:
HighLightCode:为高亮代码的基类,并抽象,含有抽象方法
通过方法实现实例
RegexCSharp:实现HighLightCode方法。
当前为C#实现了该方法,如果Java类实现该方法,则可以扩展出Java的着色代码.
思路:
如果我们直接使用正则表达式进行匹配,那么比较麻烦,会出现一些问题,如://string abc = "hello";那么"hello"会被分析为引号部分,而非注释部分。要解决该问题,我们先分析一下代码着色的原理和基础。
特殊的符号包括单引号,双引号,单行注释,多行注释的判断,由于这些情况都是成对的出现,我们需要找出这4个情况前后匹配的数据进行分组处理。
注意,单行注释由//开头,\r\n结尾
如:string abc= "hello!";
那么string abc=作为group1,"hello!"作为group2,;作为group3。那么在group1和group3我们需要的仅仅是对关键字进行匹配,在这里最简单的方法就是正则表达式进行匹配和着色。那么对于group2无非就是添加深红色而已。但是对于分组我们需要找到最先出现的符号位置,如:string abc = "hello // world!";此时的//应该作为字符串而非注释,所以它必须为group2中。
分组方法:
我们先讨论只有一个目标符号的情况。即:string abc= "hello!";
我们首先将4个符号的出现的初始位置找到,进行排序,得到位置最小的符号,那么该组就是以该符号为基准。在这里,我使用了List进行排序。得到位置最小的符号组,那么它就是我们要寻找的目标符号,于是寻找他的结尾符号,则可以得到它具体的字符串。
循环流程:
由于程序不会只有一个目标符号,如:
string a1= "hello!";
string a2= "i love you!";
//string "a3";
上面实例则存在7个组
group1=string a1=
group2="hello!"
group3=;
group4=string a2=
group5="i love you!"
group6=;
group7=//string "a3";
这样的组会存在多个,于是我们从目标字符串的0位置开始到它的长度进行循环(for(int i=0;i<code.length;i++)),得到多个的目标组。
相关专题
- 用C#调外部Ping命令获取网络连接情况 (58次浏览)
- 数据结构(C#)_排序算法(冒泡排序) (44次浏览)
- C#如何把html中的相对路径变成绝对路径 (36次浏览)
- C#基础概念二十五问 (34次浏览)
- C#多线程学习—生产者和消费者 (33次浏览)
- 在C#.net中操作XML实例 (28次浏览)
- 截取字符串方法总结 (24次浏览)
- C#WIN窗体读取EXCEL存入SQL数据库 (24次浏览)
- C#与数据结构 (24次浏览)
- C#创建简单的验证码 (22次浏览)




