正則表達式平時不常用,經常都是用的時候,臨時抱佛腳,查文檔,然後就是被各種坑之後,才會逐漸熟練。 線上正則表達式測試:http://tool.oschina.net/regex/ 線上JSON格式化:https://www.bejson.com/ 正則表達式手冊:http://tool.oschin ...
正則表達式平時不常用,經常都是用的時候,臨時抱佛腳,查文檔,然後就是被各種坑之後,才會逐漸熟練。
線上正則表達式測試:http://tool.oschina.net/regex/
線上JSON格式化:https://www.bejson.com/
正則表達式手冊:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
先來看下代碼和運行效果吧
string msg, rex; Match m; msg = "昨日總能耗0度。 (長沙市口腔醫院)星期一【紫衡技術】"; rex = @".*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \((.*)\)(.{3}).*"; m = Regex.Match(msg, rex); Console.WriteLine("0:" + m.Success); WriteGroupInfo(m); //1 msg = @"上周總能耗28401.4度。 (沙井街道辦)星期一【紫衡技術】"; rex = @".*(上周總?能耗)([0-9]{1,}[.][0-9]*)*度。 \((.*)\)(.{3}).*"; //昨日總能耗2582.1度。【長沙市天心區人民法院】2018 - 07 - 08【紫衡技術】 m = Regex.Match(msg, rex); var r = m.Success; Console.WriteLine("1:"+r); WriteGroupInfo(m); //2 rex = @".*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。\【(.*)\】(\d{4}-\d{2}-\d{2}).*"; msg= "昨日總能耗209.9度。【長沙市天心區人民檢察院】2018-07-08【紫衡技術】"; Match m1 = Regex.Match(msg, rex); Console.WriteLine("2:"+m1.Success); WriteGroupInfo(m1); //3 rex = @".*(上周總?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \((.*)\)(.{3}).*"; msg = "上周總能耗10922.4度。 (深圳市地方稅務局第二稽查局)星期一【紫衡技術】"; m1 = Regex.Match(msg, rex); Console.WriteLine("3:"+m1.Success); WriteGroupInfo(m1); //4 rex = @".*(上月總?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \((.*)\)(.{8}).*"; msg = "上月總能耗49276.9度。 (深圳市地方稅務局第二稽查局)2018年06月【紫衡技術】"; m1 = Regex.Match(msg, rex); Console.WriteLine("4:"+m1.Success); WriteGroupInfo(m1); //5 rex = @".*(建築名稱)\:(.*),在(\d{4}-\d{2}-\d{2}).{3}([0-9]{1,}[.][0-9]*)*度。"; msg = "建築名稱:長沙市天心區人民法院,在2018-07-08日用電2582.1度。"; m1 = Regex.Match(msg, rex); Console.WriteLine("5:"+m1.Success); WriteGroupInfo(m1); //6 rex = @"(今日能耗)\:([0-9]{1,}[.]?[0-9]*)"; msg = "今日能耗:300【紫衡技術】"; m1 = Regex.Match(msg, rex); Console.WriteLine("6:" + m1.Success); WriteGroupInfo(m1); //^【([^】]+)】異常(.+?)服務(【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)
//*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*.+ rex = @"^【([^】]+)】異常(.+?)服務(【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*
(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*.+"; msg = "【公司WNC服務監控台】異常 - 服務【Secom.Emx.SmsServer.Service】未找到或者未安裝!【紫衡技術】"; m1 = Regex.Match(msg, rex); Console.WriteLine("7:" + m1.Success); WriteGroupInfo(m1); Console.ReadKey(); } private static void WriteGroupInfo(Match m) { var g = m.Groups; if (g.Count > 0) { for (var i = 0; i < g.Count; i++) { Console.WriteLine(i+":"+g[i].Value); } } }
運行結果:
需要註意的地方,待匹配文字中的空格以及全形和半形字元要註意區分。
存儲正則表達式字元串,不能存儲到Json文件中,特殊字元會出現轉義,存XML中沒有這個問題。通過構造sql語句存儲到mysql中的時候,反斜杠\將會被直接吃掉,所以插入之前要先進行轉義。
var _TemplateReg = v.Value.TemplateReg.Replace("\\", "\\\\");
在C#中\\表示\,\\\\就表示\\。
之前在一個全局變數中存儲了許多數據,現在我需要將其存儲到資料庫中。原來的代碼如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 簡訊模板 /// </summary> #region old code Dictionary<string, SmsTemplate> templates = new Dictionary<string, SmsTemplate> { // 能耗日報模板 { "能耗提醒", new SmsTemplate { TemplateCode = "SMS_139242133", TemplateReg = @"測試簡訊通知", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "紫衡技術" } }, { "測試", new SmsTemplate { TemplateCode = "SMS_119091381", TemplateReg = @"測試簡訊通知", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "紫衡技術" } }, { "能耗", new SmsTemplate { TemplateCode = "SMS_119076277", TemplateReg = @"^[^(上周)|(上月)]*(能耗)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*$", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "能耗Extend", new SmsTemplate { TemplateCode = "SMS_128880488", TemplateReg = @"^[^(上周)|(上月)]*(能耗)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*$", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty, extend=string.Empty}, SignName = "能耗報告" } }, { "昨日能耗", new SmsTemplate { TemplateCode = "SMS_139242142", TemplateReg = @".*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \((.*)\)(.{3}).*",//昨日總能耗16677.6度。 (天心區鑫遠白天鵝酒店)星期一【紫衡技術】 TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "昨日能耗1", new SmsTemplate { TemplateCode = "SMS_139242142", TemplateReg = @".*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。\【(.*)\】(\d{4}-\d{2}-\d{2}).*",//昨日總能耗209.9度。【長沙市天心區人民檢察院】2018-07-08【紫衡技術】 TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "上周能耗", new SmsTemplate { TemplateCode = "SMS_119081757", TemplateReg = @".*(上周總?能耗)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "上月能耗", new SmsTemplate { TemplateCode = "SMS_119086386", TemplateReg = @".*(上月總?能耗)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "定額", new SmsTemplate { TemplateCode = "SMS_119076277", TemplateReg = @".*(定額)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "基準", new SmsTemplate { TemplateCode = "SMS_119076277", TemplateReg = @".*(基準)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "節能量", new SmsTemplate { TemplateCode = "SMS_119076277", TemplateReg = @".*(節能量)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, { "優化", new SmsTemplate { TemplateCode = "SMS_119076277", TemplateReg = @".*(優化)值*[::]*([\d.]+).*\(([^)]+)\)(\d{4}-\d{2}-\d{2}).*", TemplateParam = new { name=string.Empty, date=string.Empty, energy=string.Empty }, SignName = "能耗報告" } }, // 報警日報模板 { "報警", new SmsTemplate { TemplateCode = "SMS_119076278", TemplateReg = @"(建築\[)*(.+?)([\],,])*產生以下報警:(.+)(【紫衡技術】)", TemplateParam = new { name=string.Empty, date=string.Empty, alarm=string.Empty }, SignName = "能管系統報警" } }, // 運維工單模板 { "運維通知", new SmsTemplate { TemplateCode = "SMS_119091206", TemplateReg = "您有一條新的(.+)工單需處理【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "運維搶單", new SmsTemplate { TemplateCode = "SMS_119076276", TemplateReg = "您有一條新的(.+)工單(提示)*【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "運維派單", new SmsTemplate { TemplateCode = "SMS_119076273", TemplateReg = "您有新的(.+)工單無人[搶|接]單【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "庫存不足", new SmsTemplate { TemplateCode = "SMS_119091203", TemplateReg = ".+【([^】]+)】.+庫存已不足.+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "維修簽到", new SmsTemplate { TemplateCode = "SMS_119076712", TemplateReg = ".*您有(.*)未簽到【工單號:([^】]+)】.+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } } , { "報警搶單", new SmsTemplate { TemplateCode = "SMS_119091869", TemplateReg = "您有(.*)報警.*無人[搶|接]單【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } } , { "廣醫派工", new SmsTemplate { TemplateCode = "SMS_135795374", TemplateReg = "您有新的(.+)工單(.+)需處理,詳情請打開“智慧機電運維繫統APP”查看。", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } } , { "報警簽到", new SmsTemplate { TemplateCode = "SMS_119081998", TemplateReg = "您有(.*)報警事件未現場簽到【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "未處理完崔單", new SmsTemplate { TemplateCode = "SMS_119076997", TemplateReg = "您有(.*)處理尚未完成【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "運維崔單", new SmsTemplate { TemplateCode = "SMS_119087014", TemplateReg = "您有一條(.+)催單提示【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "運維工單事件", new SmsTemplate { TemplateCode = "SMS_119091936", TemplateReg = "您有新的工單事件【工單號[::]([^】]+).+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "運維繫統" } }, { "MAN服務未找到異常", new SmsTemplate { TemplateCode = "SMS_120120306", TemplateReg = "^【([^】]+)】異常(.+?)服務(【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*.+", TemplateParam = new { type=string.Empty, code=string.Empty }, SignName = "能管365" } } }; #endregionView Code
我想直接通過代碼來自動將其遷移到mysql資料庫中去。
/// <summary> /// 初始化數據,將原來代碼中的模板配置生成並載入到資料庫中 /// </summary> /// <param name="templates"></param> /// <returns></returns> public int InitData(Dictionary<string, SmsTemplate> templates) { StringBuilder sb = new StringBuilder(); sb.Append("INSERT INTO smstemplate VALUES"); foreach(var v in templates) { var _TemplateReg = v.Value.TemplateReg.Replace("\\", "\\\\"); sb.AppendFormat(@"('{0}','{1}','{2}','{3}','{4}'),",v.Key,v.Value.TemplateCode, _TemplateReg, JsonConvert.SerializeObject(v.Value.TemplateParam),v.Value.SignName); } string sql= sb.ToString().TrimEnd(','); var cmd = db.GetSqlStringCommand(sql); return db.ExecuteNonQuery(cmd); } /// <summary> /// 從資料庫中載入模板配置列表 /// </summary> /// <returns>模板配置列表</returns> public Dictionary<string, SmsTemplate> GetSmsTemplate() { Dictionary<string, SmsTemplate> dic = new Dictionary<string, SmsTemplate>(); var sql = "SELECT `Key`,`TemplateCode`,`TemplateReg`,`TemplateParam`,`SignName` FROM smstemplate"; try { var cmd = db.GetSqlStringCommand(sql); SmsTemplate item; string key; using (var reader = db.ExecuteReader(cmd)) { while (reader.Read()) { key = reader.GetString(0); item = new SmsTemplate(); item.TemplateCode = reader.GetString(1); item.TemplateReg = reader.GetString(2); item.TemplateParam = (JObject)JsonConvert.DeserializeObject(reader.GetString(3)); item.SignName = reader.GetString(4); dic.Add(key, item); } } } catch(Exception ex) { throw new Exception(ex.Message); } return dic; }
構造完成後的sql腳本:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
INSERT INTO smstemplate VALUES ( '能耗提醒', 'SMS_139242133', '測試簡訊通知', '{"name":"","date":"","energy":""}', '紫衡技術' ), ( '測試', 'SMS_119091381', '測試簡訊通知', '{"name":"","date":"","energy":""}', '紫衡技術' ), ( '能耗', 'SMS_119076277', '^[^(上周)|(上月)]*(能耗)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*$', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '能耗Extend', 'SMS_128880488', '^[^(上周)|(上月)]*(能耗)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*$', '{"name":"","date":"","energy":"","extend":""}', '能耗報告' ), ( '昨日能耗', 'SMS_139242142', '.*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \\((.*)\\)(.{3}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '昨日能耗1', 'SMS_139242142', '.*(昨日總?能耗)([0-9]{1,}[.]?[0-9]*)*度。\\【(.*)\\】(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '上周能耗', 'SMS_119081757', '.*(上周總?能耗)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '上月能耗', 'SMS_119086386', '.*(上月總?能耗)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '定額', 'SMS_119076277', '.*(定額)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '基準', 'SMS_119076277', '.*(基準)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '節能量', 'SMS_119076277', '.*(節能量)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '優化', 'SMS_119076277', '.*(優化)值*[::]*([\\d.]+).*\\(([^)]+)\\)(\\d{4}-\\d{2}-\\d{2}).*', '{"name":"","date":"","energy":""}', '能耗報告' ), ( '報警', 'SMS_119076278', '(建築\\[)*(.+?)([\\],,])*產生以下報警:(.+)(【紫衡技術】)', '{"name":"","date":"","alarm":""}', '能管系統報警' ), ( '運維通知', 'SMS_119091206', '您有一條新的(.+)工單需處理【工單號[::]([^】]+).+', '{"type":"","code":""}', '運維繫統' ), ( '運維搶單', 'SMS_119076276', <