NET 規則運算式

文章推薦指數: 80 %
投票人數:10人

當您從清單產生信封標籤時,如果不想包括稱謂,就可以使用規則運算式來移除稱謂,如下列範例所示。

C# 複製. using System; using ... 跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 語言 閱讀英文 儲存 目錄 閱讀英文 儲存 Twitter LinkedIn Facebook 電子郵件 目錄 .NET規則運算式 發行項 06/23/2022 14位參與者 本文內容 規則運算式提供功能強大、彈性且有效率的方法來處理文字。

正則運算式的廣泛模式比對標記法可讓您快速剖析大量的文字,以: 尋找特定的字元模式。

驗證文字以確保其符合預先定義的模式,(例如電子郵件地址)。

擷取、編輯、取代或刪除文字子字串。

將擷取的字串新增至集合,以產生報表。

對許多處理字串或剖析大型文字區塊的應用程式而言,規則運算式是不可或缺的工具。

正則運算式的運作方式 使用規則運算式來處理文字的核心是規則運算式引擎,以.NET中的System.Text.RegularExpressions.Regex物件來表示。

使用規則運算式來處理文字時,至少需要提供規則運算式引擎以及下列兩個資訊項目: 要在文字中識別的規則運算式模式。

在.NET中,規則運算式模式是以特殊的語法或語言來定義,其相容於Perl5規則運算式,並新增一些其他功能,例如由右至左比對。

如需詳細資訊,請參閱規則運算式語言-快速參考。

要為規則運算式模式剖析的文字。

Regex類別的方法可讓您執行下列作業: 呼叫Regex.IsMatch方法,以判定規則運算式模式是否出現在輸入文字中。

如需使用IsMatch方法來驗證文字的範例,請參閱如何:確認字串是否為有效的電子郵件格式。

呼叫Regex.Match或Regex.Matches方法,以擷取符合規則運算式模式的所有文字。

前一個方法會傳回System.Text.RegularExpressions.Match物件,提供相符文字的相關資訊。

後一個方法會傳回MatchCollection物件,其中針對在所剖析文字中找到的每個相符項目,各包含一個System.Text.RegularExpressions.Match物件。

呼叫Regex.Replace方法,以取代符合規則運算式模式的文字。

如需使用Replace方法來變更日期格式,以及移除字串中無效字元的範例,請參閱如何:從字串中刪除無效的字元和如何:變更日期格式。

如需規則運算式物件模型概觀,請參閱規則運算式物件模型。

如需規則運算式語言的詳細資訊,請參閱規則運算式語言-快速參考,或下載並列印下列其中一本小手冊: Word(.docx)格式的快速參考 PDF(.pdf)格式的快速參考 規則運算式範例 String類別包含數種字串搜尋和取代方法,可供您在大型字串中尋找常值字串時使用。

當您想要在大型字串中尋找數個子字串時,或是當您想要識別字串中的模式時,規則運算式最為好用,如下列範例所示。

警告 使用System.Text.RegularExpressions來處理不受信任的輸入時,請傳遞逾時。

惡意使用者可以提供輸入來RegularExpressions造成拒絕服務攻擊。

ASP.NETCore使用RegularExpressions逾時的架構API。

提示 System.Web.RegularExpressions命名空間包含一些規則運算式物件,這些物件會實作預先定義的規則運算式模式,以用於剖析來自HTML、XML和ASP.NET文件的字串。

例如,TagRegex類別會識別字串中的開始標記,而CommentRegex類別會識別字串中的ASP.NET註解。

範例1:取代子字串 假設郵寄清單包含的名稱有時候會包括稱謂(Mr.、Mrs.、Miss或Ms.)以及姓名。

當您從清單產生信封標籤時,如果不想包括稱謂,就可以使用規則運算式來移除稱謂,如下列範例所示。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern="(Mr\\.?|Mrs\\.?|Miss|Ms\\.?)"; string[]names={"Mr.HenryHunt","Ms.SaraSamuels", "AbrahamAdams","Ms.NicoleNorris"}; foreach(stringnameinnames) Console.WriteLine(Regex.Replace(name,pattern,String.Empty)); } } //Theexampledisplaysthefollowingoutput: //HenryHunt //SaraSamuels //AbrahamAdams //NicoleNorris ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="(Mr\.?|Mrs\.?|Miss|Ms\.?)" Dimnames()AsString={"Mr.HenryHunt","Ms.SaraSamuels",_ "AbrahamAdams","Ms.NicoleNorris"} ForEachnameAsStringInnames Console.WriteLine(Regex.Replace(name,pattern,String.Empty)) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'HenryHunt 'SaraSamuels 'AbrahamAdams 'NicoleNorris 規則運算式模式(Mr\.?|Mrs\.?|Miss|Ms\.?)會比對所出現的任何"Mr"、"Mr."、"Mrs"、"Mrs."、"Miss"、"Ms或"Ms."。

呼叫Regex.Replace方法會將相符的字串取代為String.Empty;換句話說,就是將其從原始字串中移除。

範例2:識別重複的字組 不小心重複文字是作者常犯的錯誤。

規則運算式可用來識別重複的文字,如下列範例所示。

usingSystem; usingSystem.Text.RegularExpressions; publicclassClass1 { publicstaticvoidMain() { stringpattern=@"\b(\w+?)\s\1\b"; stringinput="Thisthisisaniceday.Whataboutthis?Thistastesgood.Isawaadog."; foreach(MatchmatchinRegex.Matches(input,pattern,RegexOptions.IgnoreCase)) Console.WriteLine("{0}(duplicates'{1}')atposition{2}", match.Value,match.Groups[1].Value,match.Index); } } //Theexampledisplaysthefollowingoutput: //Thisthis(duplicates'This')atposition0 //aa(duplicates'a')atposition66 ImportsSystem.Text.RegularExpressions ModulemodMain PublicSubMain() DimpatternAsString="\b(\w+?)\s\1\b" DiminputAsString="Thisthisisaniceday.Whataboutthis?Thistastesgood.Isawaadog." ForEachmatchAsMatchInRegex.Matches(input,pattern,RegexOptions.IgnoreCase) Console.WriteLine("{0}(duplicates'{1}')atposition{2}",_ match.Value,match.Groups(1).Value,match.Index) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'Thisthis(duplicates'This')atposition0 'aa(duplicates'a')atposition66 規則運算式模式\b(\w+?)\s\1\b可解譯如下: 模式 解譯 \b 從字緣開始。

(\w+?) 比對一或多個字元,但字元數愈少愈好。

這些一起構成可稱之為\1的群組。

\s 比對空白字元。

\1 比對等同於名為\1之群組的子字串。

\b 比對字邊界。

呼叫Regex.Matches方法時,規則運算式選項設為RegexOptions.IgnoreCase。

因此,比對作業不區分大小寫,而且此範例會將子字串"Thisthis"視為重複。

輸入字串包含子字串「this?This"。

不過,因為中間有標點符號,所以不會將其視為重複。

範例3:動態建置區分文化特性的正則運算式 下列範例說明規則運算式結合.NET全球化功能所提供的彈性,功能有多麼強大。

它會使用NumberFormatInfo物件來判定系統目前文化特性中的幣值格式,然後利用該資訊動態建構可從文字擷取幣值的規則運算式。

針對每個比對,它會擷取僅包含數值字串的子群組,將其轉換成Decimal值,並計算執行總計。

usingSystem; usingSystem.Collections.Generic; usingSystem.Globalization; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { //Definetexttobeparsed. stringinput="Officeexpenseson2/13/2008:\n"+ "Paper(500sheets)$3.95\n"+ "Pencils(boxof10)$1.00\n"+ "Pens(boxof10)$4.49\n"+ "Erasers$2.19\n"+ "Inkjetprinter$69.95\n\n"+ "TotalExpenses$81.58\n"; //Getcurrentculture'sNumberFormatInfoobject. NumberFormatInfonfi=CultureInfo.CurrentCulture.NumberFormat; //Assignneededpropertyvaluestovariables. stringcurrencySymbol=nfi.CurrencySymbol; boolsymbolPrecedesIfPositive=nfi.CurrencyPositivePattern%2==0; stringgroupSeparator=nfi.CurrencyGroupSeparator; stringdecimalSeparator=nfi.CurrencyDecimalSeparator; //Formregularexpressionpattern. stringpattern=Regex.Escape(symbolPrecedesIfPositive?currencySymbol:"")+ @"\s*[-+]?"+"([0-9]{0,3}("+groupSeparator+"[0-9]{3})*("+ Regex.Escape(decimalSeparator)+"[0-9]+)?)"+ (!symbolPrecedesIfPositive?currencySymbol:""); Console.WriteLine("Theregularexpressionpatternis:"); Console.WriteLine(""+pattern); //Gettextthatmatchesregularexpressionpattern. MatchCollectionmatches=Regex.Matches(input,pattern, RegexOptions.IgnorePatternWhitespace); Console.WriteLine("Found{0}matches.",matches.Count); //Getnumericstring,convertittoavalue,andaddittoListobject. Listexpenses=newList(); foreach(Matchmatchinmatches) expenses.Add(Decimal.Parse(match.Groups[1].Value)); //Determinewhethertotalispresentandifpresent,whetheritiscorrect. decimaltotal=0; foreach(decimalvalueinexpenses) total+=value; if(total/2==expenses[expenses.Count-1]) Console.WriteLine("Theexpensestotal{0:C2}.",expenses[expenses.Count-1]); else Console.WriteLine("Theexpensestotal{0:C2}.",total); } } //Theexampledisplaysthefollowingoutput: //Theregularexpressionpatternis: //\$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) //Found6matches. //Theexpensestotal$81.58. ImportsSystem.Collections.Generic ImportsSystem.Globalization ImportsSystem.Text.RegularExpressions PublicModuleExample PublicSubMain() 'Definetexttobeparsed. DiminputAsString="Officeexpenseson2/13/2008:"+vbCrLf+_ "Paper(500sheets)$3.95"+vbCrLf+_ "Pencils(boxof10)$1.00"+vbCrLf+_ "Pens(boxof10)$4.49"+vbCrLf+_ "Erasers$2.19"+vbCrLf+_ "Inkjetprinter$69.95"+vbCrLf+vbCrLf+_ "TotalExpenses$81.58"+vbCrLf 'Getcurrentculture'sNumberFormatInfoobject. DimnfiAsNumberFormatInfo=CultureInfo.CurrentCulture.NumberFormat 'Assignneededpropertyvaluestovariables. DimcurrencySymbolAsString=nfi.CurrencySymbol DimsymbolPrecedesIfPositiveAsBoolean=CBool(nfi.CurrencyPositivePatternMod2=0) DimgroupSeparatorAsString=nfi.CurrencyGroupSeparator DimdecimalSeparatorAsString=nfi.CurrencyDecimalSeparator 'Formregularexpressionpattern. DimpatternAsString=Regex.Escape(CStr(IIf(symbolPrecedesIfPositive,currencySymbol,"")))+_ "\s*[-+]?"+"([0-9]{0,3}("+groupSeparator+"[0-9]{3})*("+_ Regex.Escape(decimalSeparator)+"[0-9]+)?)"+_ CStr(IIf(NotsymbolPrecedesIfPositive,currencySymbol,"")) Console.WriteLine("Theregularexpressionpatternis:") Console.WriteLine(""+pattern) 'Gettextthatmatchesregularexpressionpattern. DimmatchesAsMatchCollection=Regex.Matches(input,pattern,RegexOptions.IgnorePatternWhitespace) Console.WriteLine("Found{0}matches.",matches.Count) 'Getnumericstring,convertittoavalue,andaddittoListobject. DimexpensesAsNewList(OfDecimal) ForEachmatchAsMatchInmatches expenses.Add(Decimal.Parse(match.Groups.Item(1).Value)) Next 'Determinewhethertotalispresentandifpresent,whetheritiscorrect. DimtotalAsDecimal ForEachvalueAsDecimalInexpenses total+=value Next Iftotal/2=expenses(expenses.Count-1)Then Console.WriteLine("Theexpensestotal{0:C2}.",expenses(expenses.Count-1)) Else Console.WriteLine("Theexpensestotal{0:C2}.",total) EndIf EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'Theregularexpressionpatternis: '\$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) 'Found6matches. 'Theexpensestotal$81.58. 在目前文化特性為English-UnitedStates(en-US)的電腦上,此範例會動態建立規則運算式\$\s*[-+]?([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?)。

此規則運算式模式可解譯如下: 模式 解譯 \$ 在輸入字串中尋找單獨出現的貨幣符號($)。

規則運算式模式字串包含反斜線,表示貨幣符號要解譯為字面意義,而不是規則運算式錨點。

(單$一符號會指出正則運算式引擎應該嘗試在字串結尾開始比對。

)為了確保目前文化特性的貨幣符號不會誤譯為正則運算式符號,範例會呼叫Regex.Escape方法來逸出字元。

\s* 尋找出現零或多次的空格字元。

[-+]? 尋找出現一或多次的正號或負號。

([0-9]{0,3}(,[0-9]{3})*(\.[0-9]+)?) 此運算式外面括號將其定義成擷取群組或子運算式。

如果找到相符項目,從Group屬性傳回之GroupCollection物件中的第二個Match.Groups物件,擷取此部分比對字串的相關資訊。

(集合中的第一個項目代表整個比對。

) [0-9]{0,3} 尋找出現零到三次的十進位數字0到9。

(,[0-9]{3})* 尋找出現零或多次、後面接三個十進位數字的群組分隔符號。

\. 尋找單次出現的十進位分隔符號。

[0-9]+ 尋找一或多個十進位數字。

(\.[0-9]+)? 尋找出現零或一次、後接至少一個十進位數字的十進位分隔符號。

如果在輸入字串中找到上述每個子模式,則比對成功,並且會將包含此比對相關資訊的Match物件加入至MatchCollection物件。

相關主題 標題 說明 規則運算式語言-快速參考 提供您可以用來定義規則運算式之字元、運算子和建構組合的資訊。

規則運算式物件模型 提供資訊和程式碼範例,說明如何使用規則運算式類別。

規則運算式行為的詳細資訊 提供.NET規則運算式之功能和行為的相關資訊。

在VisualStudio中使用正則運算式 參考 System.Text.RegularExpressions System.Text.RegularExpressions.Regex 規則運算式-快速參考(以Word格式下載) 規則運算式-快速參考(以PDF格式下載) 本文內容



請為這篇文章評分?