1. 程式人生 > >C# 正則表示式應用

C# 正則表示式應用

正則表示式平時不常用,經常都是用的時候,臨時抱佛腳,查文件,然後就是被各種坑之後,才會逐漸熟練。

先來看下程式碼和執行效果吧

 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#中\\表示\,\\\\就表示\\。

之前在一個全域性變數中儲存了許多資料,現在我需要將其儲存到資料庫中。原來的程式碼如下:

        /// <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"
                }
            }

        };
        #endregion
View 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指令碼:
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',
        '您有一條新的(.+)工單(提示)*【工單號[::]([^】]+).+',