天天看點

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)

平常喜歡寫點小東西玩玩,既可以娛樂自己滿足自己的虛榮心,又可以友善工作和學習,今天且拿出一個來,與大家一起分享!

 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!

先看看我是怎麼做的:

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)

 首先請無視工具欄那幾個按鈕,沒啥作用(後面會提到),左側兩個文本框,上面的是輸入,下面的是輸出,右側,是程式的核心部分,一個指令輸入文本框(類似于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的使用方式,

首先引用程式集

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)

  接下這一步是非必要的,可以根據自己的需要來調整。在這裡我們要定義腳本所要繼承的類和要實作的接口,:

  代碼分别如下:

  BaseCommand.cs 檔案

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
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 檔案

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
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 }      

 當定義完畢之後就可以開始寫腳本代碼了

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)

  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檔案的内容了

玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
玩程式 之 一 . 字元串處理工具(可通過C#腳本擴充)
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]

[轉載請保留作者資訊  作者:馮天文 ]