正規表達式平時不常用,經常都是用的時候,臨時抱佛腳,查文檔,然後就是被各種坑之後,才會逐漸熟練。
線上正規表達式測試: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#中\\表示\,\\\\就表示\\。
之前在一個全局變量中存儲了許多資料,現在我需要将其存儲到資料庫中。原來的代碼如下:
/// <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',
'您有一條新的(.+)工單(提示)*【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'運維派單',
'SMS_119076273',
'您有新的(.+)工單無人[搶|接]單【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'庫存不足',
'SMS_119091203',
'.+【([^】]+)】.+庫存已不足.+',
'{"type":"","code":""}',
'運維系統'
),
(
'維修簽到',
'SMS_119076712',
'.*您有(.*)未簽到【工單号:([^】]+)】.+',
'{"type":"","code":""}',
'運維系統'
),
(
'報警搶單',
'SMS_119091869',
'您有(.*)報警.*無人[搶|接]單【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'廣醫派工',
'SMS_135795374',
'您有新的(.+)工單(.+)需處理,詳情請打開“智慧機電運維系統APP”檢視。',
'{"type":"","code":""}',
'運維系統'
),
(
'報警簽到',
'SMS_119081998',
'您有(.*)報警事件未現場簽到【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'未處理完崔單',
'SMS_119076997',
'您有(.*)處理尚未完成【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'運維崔單',
'SMS_119087014',
'您有一條(.+)催單提示【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'運維工單事件',
'SMS_119091936',
'您有新的工單事件【工單号[::]([^】]+).+',
'{"type":"","code":""}',
'運維系統'
),
(
'MAN服務未找到異常',
'SMS_120120306',
'^【([^】]+)】異常(.+?)服務(【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*(服務【([^】]+)】未找到或者未安裝!)*.+',
'{"type":"","code":""}',
'能管365'
)
JsonConvert.SerializeObject(v.Value.TemplateParam),把原來的對象進行序列化。
之前一直用的線上正規表達式比對http://tool.oschina.net/regex/,不過發現不友善,于是我自己寫了一個小工具。
C# 正規表達式應用
源碼下載下傳:https://github.com/zouyujie/RegexTool
吐槽:阿裡雲的短信平台,短信模闆中的單個變量長度不超過20個字元,而且還不支援組合變量,變量之間要用文字或者字元隔開,這樣一來,假設我有需要發出去的變量文字是超過20個字元的,就不得不拆開,中間還要用字元或者漢字拆開,那麼這樣的話,客戶收到的短信豈不是很奇葩,活生生的一些連續的描述文字被拆開了。
記錄以備忘。
部落格位址: | http://www.cnblogs.com/jiekzou/ |
部落格版權: | 本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。 如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步! 再次感謝您耐心的讀完本篇文章。 |
其它: | .net-QQ群4:612347965 java-QQ群:805741535 H5-QQ群:773766020 我的拙作《ASP.NET MVC企業級實戰》《H5+移動應用實戰開發》 《Vue.js 2.x實踐指南》 《JavaScript實用教程 》 《Node+MongoDB+React 項目實戰開發》 已經出版,希望大家多多支援! |