正則表達式測試工具「RegexTester」,下載地址:http://www.oschina.net/p/regex+tester正則表達式
今天的工做中遇到了一些正則表達式,我須要檢驗它們是否正確,不過我對本身目測的結果又沒有信心。後來我想起之前看過一個帖子《正則表達式30分鐘入門教程》,裏面提到過一個工具叫作「RegexTester」,不過下載下來卻感到用起來比較棘手。由於是第一次用的緣故,這個軟件也沒有提供足夠多的幫助信息。因此我下班後研究了一下這個軟件的幾個主要功能,研究結果記錄以下。工具
其實這個軟件真正的名字叫「YART」,它是「Yet Another Regex Tester」的縮寫,翻譯成中文就是「另一個正則表達式測試工具」。在Form的Title位置,寫的文字是「Code Archiects Regex Tester」,說明這是給代碼設計師(就是程序猿)使用的正則表達式測試工具。oop
Find功能旨在從一個源字符串(Source)中,經過給出的正則表達式(Regex),找出匹配的子串(Matches)。進入Find功能的快捷鍵是「Ctrl+F」,該界面包含Regex、Source、Matches三個區域。按下命令(Commands)菜單中的執行(Run),能夠生成結果集,快捷鍵爲F5。測試
在Regex區域中輸入正則表達式,在Source區域中輸入待匹配的文本,Matches區域爲程序判斷的結果集spa
Find功能的判斷邏輯,表現成代碼,是這個樣子的:.net
VB.NET代碼:翻譯
Dim re As New Regex("[0-9]{8}", RegexOptions.None) Dim mc As MatchCollection = re.Matches("text") For Each ma As Match in mc 'TODO Next
C#代碼:設計
Regex re = new Regex(@"[0-9]{8}", RegexOptions.None); MatchCollection mc = re.Matches("text"); foreach (Match ma in mc) { //TODO }
這些代碼是經過「生成代碼」(Generate Code)功能獲得的,進入該功能的快捷鍵爲F2,這個界面能夠生成VB.NET和C#兩種代碼,其中C#還能夠在字符串前加「 @ 」符號,說明該字符串忽略其中的C#轉義字符:code
Replace功能的做用是從一個源字符串(Source)中,經過給出的正則表達式(Regex)和替換文本(Replace),生成替換後的字符串(Report)。進入Replace功能的快捷鍵是「Ctrl+R」,該界面包含Regex、Replace、Source、Report三個區域。orm
在Regex區域中輸入正則表達式,在Replace區域中輸入要替換的文本,在Source區域中輸入源字符串,Report區域顯示替換後的字符串
Replace功能的判斷邏輯,表現成代碼,是這個樣子的:
VB.NET代碼:
Dim re As New Regex("[0-9]{8}", RegexOptions.None) Dim result As String = re.Replace("text")
C#代碼:
Regex re = new Regex(@"[0-9]{8}", RegexOptions.None); string result = re.Replace("text");
Split功能會將源字符串(Source)中的文本,按正則表達式(Regex)的匹配狀況,分紅若干子串,並返回這些子串的集合(Report)
在Regex區域中輸入正則表達式,在Source區域中輸入源字符串,Report區域顯示分割後的各個字符串
Split功能的判斷邏輯,表現成代碼,是這個樣子的:
VB.NET代碼:
Dim re As New Regex("[0-9]{8}", RegexOptions.None) Dim lines() As String = re.Split("text") For Each line As String In lines 'TODO Next
C#代碼:
Regex re = new Regex(@"[0-9]{8}", RegexOptions.None); string[] lines= re.Split("text"); foreach (string line in lines) { //TODO }
在選項菜單(Options)下面有9個正則表達式選項
若是沒有特別的說明,這些突兀的詞彙會讓人很是難以理解。後來我發現這9個選項來自於.NET中命名空間「System.Text.RegularExpressions」下的枚舉RegexOptions。因而我進入到VS中找到了RegexOptions枚舉,這些選項的實際做用能夠從這個枚舉的元數據文件中窺得一二:
#region 程序集 System.dll, v4.0.0.0 // C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll #endregion using System; namespace System.Text.RegularExpressions { // 摘要: // 提供用於設置正則表達式選項的枚舉值。 [Flags] public enum RegexOptions { // 摘要: // 指定不設置任何選項。 None = 0, // // 摘要: // 指定不區分大小寫的匹配。 IgnoreCase = 1, // // 摘要: // 多行模式。 更改 ^ 和 $ 的含義,使它們分別在任意一行的行首和行尾匹配,而不只僅在整個字符串的開頭和結尾匹配。 Multiline = 2, // // 摘要: // 指定惟一有效的捕獲是顯式命名或編號的 (?<name>…) 形式的組。 這使未命名的圓括號能夠充當非捕獲組,而且不會使表達式的語法 (?:...) // 顯得笨拙。 ExplicitCapture = 4, // // 摘要: // 指定將正則表達式編譯爲程序集。 這會產生更快的執行速度,但會增長啓動時間。 在調用 System.Text.RegularExpressions.Regex.CompileToAssembly(System.Text.RegularExpressions.RegexCompilationInfo[],System.Reflection.AssemblyName) // 方法時,不該將此值分配給 System.Text.RegularExpressions.RegexCompilationInfo.Options // 屬性。 Compiled = 8, // // 摘要: // 指定單行模式。 更改點 (.) 的含義,以使它與每一個字符(而不是除 \n 以外的全部字符)匹配。 Singleline = 16, // // 摘要: // 消除模式中的非轉義空白並啓用由 # 標記的註釋。 可是,System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace // 值不會影響或消除字符類中的空白。 IgnorePatternWhitespace = 32, // // 摘要: // 指定搜索從右向左而不是從左向右進行。 RightToLeft = 64, // // 摘要: // 爲表達式啓用符合 ECMAScript 的行爲。 該值只能與 System.Text.RegularExpressions.RegexOptions.IgnoreCase、System.Text.RegularExpressions.RegexOptions.Multiline // 和 System.Text.RegularExpressions.RegexOptions.Compiled 值一塊兒使用。 該值與其餘任何值一塊兒使用均將致使異常。 ECMAScript = 256, // // 摘要: // 指定忽略語言中的區域性差別。 有關更多信息,請參見[<topic://cpconPerformingCulture-InsensitiveOperationsInRegularExpressionsNamespace>]。 CultureInvariant = 512, } }
這些選項能夠同時選擇一個或多個,.NET是經過位運算判斷哪一個選項起做用的。
在命令(Commands)菜單下的編譯(Compile to Assembly)中,有一個界面能夠將正則表達式編譯到dll中
Name爲dll文件名,Root Namespace爲命名空間,編譯完畢後的dll以下:
這個DLL能夠被.NET程序集引用,並調用裏面已經生成好的類
一、在文件(File)菜單的屬性(Properties)中,對YART的功能有一個統一的界面進行設置,快捷鍵爲:F4
二、在文件(File)菜單的保存(Save)和另存爲(Save As)中,能夠將當前的配置內容保存到*.regex文件中,實際上這是一個XML格式文件,下面是一個該類文件的內容樣例:
<?xml version="1.0"?> <ProjectOptions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <RegexName>test</RegexName> <RegexDescription /> <RegexText>[0-9]{8}</RegexText> <ReplaceText>TSYBIUS2014</ReplaceText> <SourceText>abcd12345678efgh87654321ijhl</SourceText> <Command>Find</Command> <RegexOptions>None</RegexOptions> <Detail>Groups</Detail> <MaxMatches>1000</MaxMatches> <Sort>Position</Sort> <WordWrap>true</WordWrap> <Format>Auto</Format> <IncludeEmptyGroups>true</IncludeEmptyGroups> <Language>VisualBasic</Language> <VerbatimStrings>false</VerbatimStrings> <InstanceMethods>true</InstanceMethods> <AssumeImports>true</AssumeImports> <GenerateLoop>true</GenerateLoop> <IncludeComment>true</IncludeComment> <CopyCodeOnExit>true</CopyCodeOnExit> </ProjectOptions>
三、在文件(File)菜單的加載源字符串(Load Source)中,能夠將文本從txt文件、doc文件內讀取到Source輸入框中,快捷鍵爲:Ctrl+L
四、在命令(Commands)菜單下的轉義字符(Escape)中,能夠按正則表達式的轉義字符,轉義(Escape)或反轉義(Unescape)字符串
五、在結果(Results)菜單下的結果集最大元素數(Max number of results)中,能夠指定結果集最多有多大,默認值爲1000
六、在結果(Results)菜單中給出告終果集的四種排序方式,它們分別是:
按匹配的前後順序(Sort on Position)
按匹配結果的字符串大小排序(Sort on Name)
按匹配結果的長短排序,短在前長在後(Shortest matches first)
按匹配結果的長短排序,長在前短在後(Largest matches first)
七、最後給關於界面一張特寫:
(這是一個用來編寫和校驗正則表達式、生成VB.NET/C#代碼、編譯dll類庫的工具)
我用VS自帶的反彙編工具ILDASM對這個程序的源碼進行了反彙編,能夠看出這個程序是用VisualBasic寫的(準確來講是VB.NET)。
END