.NET Core從2016年發佈1.0以來,至今已經3歲了,能夠說如今的.NET Core的生態已經至關完善了,可知足各行業的生產要求.若是你還在懷疑.NET Core的實用性質,是時候轉變想法了.git
在GITHUB上有一個項目:awesome-dotnet-core.專門羅列了各類.NET Core優秀的開源庫,該列表幾乎天天都在增加,.NET Core生態的高速增加因而可知一斑.github
爲了更好地普及.NET Core,方便.NET開發者,爲.NET Core生態建設添磚加瓦,我產生了建立awesome-dotnet-core系列博客的想法.該系列會不按期發佈博客,介紹awesome-dotnet-core其中一些實用的,有意思的,我能看懂的庫,儘可能以淺顯的文字,簡單的例子說明庫的用法和使用場景等.正則表達式
本系列全部博客文章和代碼示例可在個人GITHUB項目awesome-dotnet-core-learning中找到,歡迎STAR~編程
第一篇,介紹Sprache-解析器構建庫c#
示例代碼託管在GITHUB上, 歡迎STAR!編程語言
Sprache是一個簡單,輕量級的庫,用於直接在C#代碼中構造解析器,用來解析如代碼這類的結構化文本.官方的說明中,該庫不是那種"工業強度"的語言工做臺,而是介於正則表達式與全功能工具集(如ANTLR)中間的一種工具.工具
說白了,就是Sprache要比正則表達式強大,而稍遜於ANTLR這樣的文本解析工具.性能
如下示例演示了用Sprache編寫一個解析編程語言中標識符(如變量名,類名,方法名等)的示例程序.該示例參考了README中代碼.單元測試
使用Nuget安裝Sprache:測試
Install-Package Sprache
在Program.cs
中,首先增長標識符的解析規則:
// 標識符解析規則 private static Parser<string> Identifier = from leading in Parse.WhiteSpace.Many() // 能夠包含前置空格 from first in Parse.Letter.Once() // 第一個字符只能是字母 from rest in Parse.LetterOrDigit.Many() // 剩餘的字符能夠是字母或數字 from trailing in Parse.WhiteSpace.Many() // 能夠包含後置空格 select new string(first.Concat(rest).ToArray()); // first+rest作爲標識符
能夠看出,解析規則是直接使用C#代碼定義的,利用Sprache提供的一些內置定義(如:Parse.Letter
),以LINQ形式組合成了一個新定義.代碼很是直觀易讀,而且是單元測試友好的.
編寫一個輔助方法,用於檢查輸入的文本中是否包含合法的標識符:
/// <summary> /// 檢查輸入的文本中是否包含合法的標識符 /// </summary> /// <param name="text">文本</param> private static void CheckIdentifier(string text) { var result = Identifier.TryParse(text); if (result.WasSuccessful) { Console.WriteLine($"[{text}]中包含合法的標識符.標識符爲: {result.Value}"); } else { Console.WriteLine($"[{text}]中不包含合法的標識符."); } }
使用TryParse
方法,嘗試利用咱們定義的規則解析一個字符串,若是成功了那麼result.WasSuccessful
爲true
,而且Value
中包含了規則的值.不然爲false
.
在Main
方法中,調用CheckIdentifier
,測試解析效果:
static void Main(string[] args) { CheckIdentifier(" a123 "); CheckIdentifier(" 1abc"); }
輸出結果:
[ a123 ]中包含合法的標識符.標識符爲: a123 [ 1abc]中不包含合法的標識符.
可見咱們定義的規則能夠正確工做.
另外,GITHUB上Sprache的README中,包含了不少資源,從教程到示例,較詳細的介紹了Sprache的用法,感興趣的朋友不要錯過.