平常喜歡寫點小東西玩玩,既可以娛樂自己滿足自己的虛榮心,又可以友善工作和學習,今天且拿出一個來,與大家一起分享!
1. 軟體介紹
言歸正傳,先看看需求,有這樣一串字元串 abc,def,ghi,jkl,mno 我想把它轉為
<td>abc</td><td>def</td><td>ghi</td><td>jkl</td><td>mno</td>
也許這很簡單,因為畢竟隻有幾條而已,但是如果這句話有上百個單元呢,我想大部分程式員應該和我一樣,寫個小程式來幫我們實作這個功能,那問題來了,挖掘機技……(好吧,習慣了),如果我現在要把上面那句轉為 abc|def|ghi|jkl|mno 又當如何,再寫一個程式? No!
先看看我是怎麼做的:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1kjM5QzNwcTMtIDO0IDN2MTMxEzMwETNxAjMtQzM0MDO08CXwETNxAjMvwFNzQzM4QzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
首先請無視工具欄那幾個按鈕,沒啥作用(後面會提到),左側兩個文本框,上面的是輸入,下面的是輸出,右側,是程式的核心部分,一個指令輸入文本框(類似于DOS視窗)(本人開發的吆^_^),帶有自動提示(是我Kiang來的),也許會有人問我,為啥做成指令行的,呵呵,裝逼不需要解釋。
這裡面實作了幾中常見字元串處理的方式,但是你以為這就完了嗎,然而并沒有,哥這個是帶有腳本功能的,也就是說,這個不起眼的程式是可以通過腳本來擴充的。
2. 腳本擴充
該程式使用了CSScript (英文的,别急着點,看完這篇先),CSScript 是(奉上我渣渣的中文翻譯)
CS-Script (讀作 C sharp script) 使用ECMA标準的C#作為程式設計語言并基于 CLR (Common Language Runtime) 的腳本系統 . CS-Script 目前支援 Windows 和 Linux 的 CLR (MS .NET4.0 and Mono).
簡單來說就是通過.Net程式動态加載CS-Script,使用方式和C/C++ 調用的Lua等語言的方式一樣,當然我是猜的,我也不清楚,這裡先看看CS-Script的使用方式,
首先引用程式集
接下這一步是非必要的,可以根據自己的需要來調整。在這裡我們要定義腳本所要繼承的類和要實作的接口,:
代碼分别如下:
BaseCommand.cs 檔案
1 using System;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Linq;
5 using System.Text;
6 using System.Windows.Forms;
7 namespace StringTools
8 {
9 /// <summary>
10 /// 腳本所要內建的父類,提供一些基本方法
11 /// </summary>
12 public class BaseCommand
13 {
14
15 /// <summary>
16 /// 窗體主體,友善在以後開發中可以通過腳本方式直接調用窗體控件,如上面沒實作任何功能的按鈕
17 /// </summary>
18 public FrmMain CurrMainForm { get; set; }
19 /// <summary>
20 /// 用于記憶目前指令行控件的字型顔色
21 /// </summary>
22 public Color DefaultColor { get; set; }
23 /// <summary>
24 /// 指令行字典
25 /// </summary>
26 public Dictionary<string, string> CommandList { get; set; }
27
28 /// <summary>
29 /// 向輸出文本框寫入文本
30 /// </summary>
31 /// <param name="message"></param>
32 public virtual void Print(string message)
33 {
34 CurrMainForm.txtOutput.Text = message;
35 CurrMainForm.txtCon.Write();
36 }
37
38 /// <summary>
39 /// 清理指令行控件内容
40 /// </summary>
41 public void ClearCommand()
42 {
43 CurrMainForm.txtCon.Clear();
44 }
45
46 /// <summary>
47 /// 向指令行控件寫資訊
48 /// </summary>
49 /// <param name="msg"></param>
50 public virtual void WriteCommand(string msg = "")
51 {
52 CurrMainForm.txtCon.Write(msg);
53 }
54
55 /// <summary>
56 /// 向指令行控件寫資訊,并帶有字型顔色
57 /// </summary>
58 /// <param name="msg"></param>
59 /// <param name="fontColor"></param>
60 public virtual void WriteCommand(string msg, Color fontColor)
61 {
62 CurrMainForm.txtCon.SelectionColor = fontColor;
63 CurrMainForm.txtCon.Write(msg);
64 CurrMainForm.txtCon.SelectionColor = DefaultColor;
65 }
66
67 /// <summary>
68 /// 初始化5個按鈕的單擊事件
69 /// </summary>
70 internal void IniteBtn()
71 {
72 CurrMainForm.btnNo1.Click += OnbtnNo_Click;
73 CurrMainForm.btnNo2.Click += OnbtnNo_Click;
74 CurrMainForm.btnNo3.Click += OnbtnNo_Click;
75 CurrMainForm.btnNo4.Click += OnbtnNo_Click;
76 CurrMainForm.btnNo5.Click += OnbtnNo_Click;
77 }
78 /// <summary>
79 /// 單擊事件方法
80 /// </summary>
81 /// <param name="sender"></param>
82 /// <param name="e"></param>
83 private void OnbtnNo_Click(object sender, EventArgs e)
84 {
85 BtnClick(int.Parse((sender as ToolStripButton).Tag.ToString()));
86 }
87 /// <summary>
88 /// 可重載方法,友善腳本中處理對應的事件方法
89 /// </summary>
90 /// <param name="index"></param>
91 public virtual void BtnClick(int index)
92 {
93
94 }
95 }
96 }
View Code
ICommand.cs 檔案
1 using System;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Linq;
5 using System.Text;
6
7 namespace StringTools
8 {
9 /// <summary>
10 /// 腳本所要是現實的接口
11 /// </summary>
12 public interface ICommand
13 {
14 /// <summary>
15 /// 指令執行方法
16 /// </summary>
17 /// <param name="cmd"></param>
18 /// <param name="inputText"></param>
19 void Exec(string cmd, string inputText);
20 /// <summary>
21 /// 幫助文檔方法
22 /// </summary>
23 /// <returns></returns>
24 string HelpDoc();
25 /// <summary>
26 /// 指令清單,繼承 BaseCommand 後預設實作
27 /// </summary>
28 Dictionary<string, string> CommandList { get; }
29 /// <summary>
30 /// 主界面 ,繼承 BaseCommand 後預設實作(腳本設定無效)
31 /// </summary>
32 FrmMain CurrMainForm { get; set; }
33 /// <summary>
34 /// 指令行預設字型顔色,繼承 BaseCommand 後預設實作(腳本設定無效)
35 /// </summary>
36 Color DefaultColor { get; set; }
37 }
38 }
當定義完畢之後就可以開始寫腳本代碼了
ExecScript.cs 是今天這篇文檔的主角,而StringExtension.cs是一些對string類型的擴充方法實作的檔案
在開始介紹之前,先對CS-Script指令做一點介紹,
- //css_import --引入一個腳本檔案(*.cs)
- //css_reference --引入程式集檔案(*.dll)
- //css_prescript and //css_postscript
- //css_resource --引入資源檔案
- //css_args -- 參數 如果腳本中有Main放,可以用
- //css_searchdir
- //css_ignore_namespace
- //css_precompiler
- //css_nuget
這些指令要放在腳本檔案的前面(類似于注釋一樣),好接下來就是ExecScript.cs檔案的内容了
1 //css_import StringExtension.cs
2
3 using System;
4 using System.Collections.Generic;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Text.RegularExpressions;
9 using System.Windows.Forms;
10 namespace StringTools
11 {
12 public class ExecScript : BaseCommand, ICommand
13 {
14 public ExecScript()
15 {
16 BuildList();
17 }
18
19 Random rand=new Random (DateTime.Now.Millisecond);
20
21 //生成指令清單,用于自動提示
22 private void BuildList()
23 {
24 CommandList = new Dictionary<string, string>();
25 CommandList.Add("rep", "rep [1] [2]\r\n -- 字元串替換,[1] 目标,[2] 替換内容");
26 CommandList.Add("repregx", "repregx [1] [2]\r\n -- 字元串替換,[1] 正規表達式 ,[2] 替換内容");
27 CommandList.Add("idx", "idx [1]\r\n -- 順序查找字元位置,[1] 字元");
28 CommandList.Add("ldx", "ldx [1]\r\n -- 逆序查找字元位置,[1] 字元");
29 CommandList.Add("len", "len\r\n -- 字元串長度");
30 CommandList.Add("spl", "spl [1]\r\n -- 字元串按指定字元分為行,[1]字元 ");
31 CommandList.Add("spe", "spe [1] [2] [3] [4]\r\n -- 字元串替換擴充,[1] 目标,[2] 左側 [3] 右側 [4] 替換内容");
32 CommandList.Add("sbr", "sbr\r\n -- 字元串封裝StringBuilder");
33 CommandList.Add("regex", "regex [1]\r\n -- 正規表達式比對");
34 CommandList.Add("popo", "popo\r\n -- 這都是泡沫");
35
36 CommandList.Add("print", "print [1]\r\n -- 向輸出列印資料");
37 CommandList.Add("cls", "cls\r\n -- 清理指令區域内容");
38 CommandList.Add("?", "?\r\n -- 幫助 同 “help”");
39 CommandList.Add("help", "help\r\n -- 幫助 同 “?”");
40 CommandList.Add("cmdlst", "cmdlst\r\n -- 列出目前可用的指令");
41 CommandList.Add("ver", "ver\r\n -- 擷取腳本版本");
42 }
43
44
45 //指令執行入口
46 public void Exec(string cmd, string inptuText)
47 {
48 if (string.IsNullOrEmpty(cmd))
49 {
50 WriteCommand();
51 return;
52 }
53
54 string[] arr = cmd.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
55
56 if (arr[0] != "regex")
57 {
58 for (int i = 1; i < arr.Length; i++)
59 {
60 if (arr[0] == "repregx" && i == 1)
61 continue;
62 arr[i] = arr[i].Replace("\\s", " ").Replace("\\t", "\t")
63 .Replace("\\d", "").Replace("\\n", "\n")
64 .Replace("\\r", "\r");
65 }
66 }
67
68 try
69 {
70 switch (arr[0])
71 {
72 case "rep":
73 Print(inptuText.Replace(arr[1], arr[2]));
74 break;
75 case "idx":
76 Print(inptuText.IndexOf(arr[1]).ToString());
77 break;
78 case "ldx":
79 Print(inptuText.LastIndexOf(arr[1]).ToString());
80 break;
81 case "len":
82 Print(inptuText.Length.ToString());
83 break;
84 case "spl":
85 Print(inptuText.SplitForRow(new char[] { arr[1][0] }));
86 break;
87 case "spe":
88 Print(inptuText.SplitWithOp(arr[1].ToCharArray(), arr[2], arr[3], arr[4]));
89 break;
90 case "sbr":
91 Print(inptuText.ToStringBuilder());
92 break;
93 case "popo":
94 StringBuilder popSbr=new StringBuilder();
95 for (int pop1 = 0; pop1 < 1000; pop1++)
96 {
97 var popoRand=rand.Next(0,9);
98 switch (popoRand-1)
99 {
100 case 0:popSbr.Append(".");break;
101 case 1:popSbr.Append("。");break;
102 case 2:popSbr.Append("o");break;
103 case 3:popSbr.Append("O");break;
104 case 4:popSbr.Append("0");break;
105 case 5:popSbr.Append("゜");break;
106 case 6:popSbr.Append("○");break;
107 case 7:popSbr.Append("O");break;
108 case 8:popSbr.Append("〇");break;
109 }
110 if (pop1 % 50 == 49)
111 {
112 popSbr.AppendLine();
113 }
114
115 }
116 Print(popSbr.ToString());
117 break;
118 case "regex":
119 var ms = Regex.Matches(inptuText, arr[1]);
120 StringBuilder regxsbr = new StringBuilder();
121 foreach (Match i in ms)
122 {
123 regxsbr.AppendLine("---------------------------");
124 regxsbr.AppendFormat("{0}\r\n", i.Value);
125 foreach (Group j in i.Groups)
126 {
127 regxsbr.AppendFormat(" {0}\r\n", j.Value);
128 }
129 }
130
131 Print(regxsbr.ToString());
132 break;
133 case "repregx":
134
135 Print(Regex.Replace(inptuText, arr[1], arr[2]));
136 break;
137
138
139 case "cmdlst":
140 StringBuilder cmdListStr = new StringBuilder();
141 var cmdList=CommandList.Keys.ToArray();
142 for (int i = 0; i <cmdList.Length; i++)
143 {
144 cmdListStr.Append(cmdList[i].PadRight(10, ' '));
145 if (i%6 == 5)
146 {
147 cmdListStr.AppendLine();
148 }
149 }
150 WriteCommand(cmdListStr.ToString());
151 break;
152 case "print":
153 Print(arr[1]);
154 break;
155 case "cls":
156 ClearCommand();
157 break;
158 case "?":
159 case "help":
160 if (arr.Length == 2 && CommandList.Keys.Contains(arr[1]))
161 {
162 WriteCommand(CommandList[arr[1]]);
163 }
164 else
165 {
166 WriteCommand(HelpDoc());
167 }
168 break;
169 case "ver":
170 WriteCommand(VersionName());
171 break;
172 default:
173 WriteCommand("未知的指令!", Color.DarkGreen);
174 break;
175 }
176
177 }
178 catch (IndexOutOfRangeException ex)
179 {
180 WriteCommand("參數錯誤!Eg:\r\n" + CommandList[arr[0]], Color.Tomato);
181 }
182 catch (Exception ex1)
183 {
184 WriteCommand("錯誤:" + ex1.Message, Color.Tomato);
185 }
186 }
187
188 //擷取幫助文檔
189 public string HelpDoc()
190 {
191 StringBuilder sbr = new StringBuilder();
192 sbr.AppendLine("幫助功能");
193 sbr.AppendLine("------------------------------------");
194 sbr.AppendLine("[指令]");
195 foreach (var i in CommandList)
196 {
197 sbr.AppendLine(i.Value);
198 }
199 sbr.AppendLine();
200 sbr.AppendLine("[注意]");
201 sbr.AppendLine("指令與各參數使用空格隔開,如果需要使用空格,請使用“\\s”");
202 sbr.AppendLine();
203 sbr.AppendLine();
204 sbr.AppendLine("------------------------------------");
205 sbr.AppendLine(VersionName());
206
207 return sbr.ToString();
208 }
209
210 public string VersionName()
211 {
212 StringBuilder sbr = new StringBuilder();
213 sbr.Append("字元串處理工具 - 腳本 v0.2 [墨雲軟體]");
214 return sbr.ToString();
215
216 }
217
218 /// <summary>
219 /// 工具欄按鈕
220 /// </summary>
221 /// <param name="index"></param>
222 public override void BtnClick(int index)
223 {
224 MessageBox.Show(index.ToString());
225 }
226
227 }
228 }
可以看到第一行我使用了
//css_import StringExtension.cs 來引入了string擴充方法的腳本
接下來就是最後的腳本加載到軟體中的部分了
1 /// <summary>
2 /// 初始化腳本
3 /// </summary>
4 /// <returns></returns>
5 private bool IniteScrpit()
6 {
7
8
9 try
10 {
11
12 //腳本初始化方式 注意 腳本必須實作ICommand 接口
13 AsmHelper asm = new AsmHelper(CSScript.Load(Config.ScriptPath,null,true));
14 cmdEntity = (ICommand)asm.CreateObject("*");
15
16 cmdEntity.CurrMainForm = this;
17 ((BaseCommand)cmdEntity).IniteBtn();
18 cmdEntity.DefaultColor = txtCon.ForeColor;
19 return true;
20 }
21 catch (Exception ex)
22 {
23 MessageBox.Show( "腳本加載錯誤:\r\n"+ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
24 Environment.Exit(0);
25 return false;
26 }
27
28
29 }
代碼下載下傳位址:
http://pan.baidu.com/s/1eQyht9g
感謝的閱覽,如有好的意見或建議歡迎不吝賜教。
最後宣傳一下自己的抓包軟體
NetAnalyzer下載下傳位址
NetAnalzyer交流群:39753670 (PS 隻提供交流平台,群主基本不說話^_^)
[轉載請保留作者資訊 作者:馮天文 網址:http://www.cnblogs.com/twzy/p/4925218.html]
[轉載請保留作者資訊 作者:馮天文 ]