C#中的正則表達式引見。本站提示廣大學習愛好者:(C#中的正則表達式引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的正則表達式引見正文
正則表達式的周全形式婚配表現法可以疾速地剖析年夜量的文本以找到特定的字符形式;提取、編纂、調換或刪除文簿子字符串;或將提取的字符串添加到聚集以生成申報。
1、正則表達式簡介
正則表達式供給了功效壯大、靈巧而又高效的辦法來處置文本。正則表達式的周全形式婚配表現法可以疾速地剖析年夜量的文本以找到特定的字符形式;提取、編纂、調換或刪除文簿子字符串;或將提取的字符串添加到聚集以生成申報。關於處置字符串(例如 HTML處置、日記文件剖析和 HTTP 標頭剖析)的很多運用法式而言,正則表達式是弗成缺乏的對象。
.NET 框架正則表達式並入了其他正則表達式完成的最多見功效,被設計為與 Perl 5 正則表達式兼容,.NET 框架正則表達式還包含一些在其他完成中還沒有供給的功效,.NET 框架正則表達式類是基類庫的一部門,而且可以和面向公共說話運轉庫的任何說話或對象一路應用。
2、字符串搜刮
正則表達式說話由兩種根本字符類型構成:原義(正常)文本字符和元字符。恰是元字符組為正則表達式供給了處置才能。以後,一切的文本編纂器都有一些搜刮功效,平日可以翻開一個對話框,在個中的一個文本框中鍵入要定位的字符串,假如還要同時停止調換操作,可以鍵入一個調換字符串,好比在Windows操作體系中的記事本、Office系列中的文檔編纂器都有這類功效。
這類搜刮最簡略的方法,這類成績很輕易用String類的String.WordStr()辦法來處理,但假如須要在文檔中辨認某個反復的,該怎樣辦?
編寫一個例程,從一個String類當選擇反復的字是比擬龐雜的,此時應用說話就很合適。
普通表達式說話是一種可以編寫搜刮表達式的說話。在該說話中,可以把文檔中要搜刮的文本、本義序列和特定寄義的其他字符組合在一路,例如序列b表現一個字的開首和開頭(子的界限),假如要表現正在查找的以字符th開首的字,便可以編寫普通表達式bth(即序列字符界是-t-h)。假如要搜刮一切以th開頭的字,便可以編寫thb(序列t-h-字界限)。然則,普通表達式要比這龐雜很多,例如,可以在搜刮操作中找到存儲部門文本的對象性法式(facility)。
3、.NET 框架的正則表達式類
上面經由過程引見 .NET 框架的正則表達式類,熟習一下.NET框架下的正則表達式的應用辦法。
3.1 Regex 類表現只讀正則表達式
Regex 類包括各類靜態辦法,許可在不顯式實例化其他類的對象的情形下應用其他正則表達式類。以下代碼示例創立了 Regex 類的實例並在初始化對象時界說一個簡略的正則表達式。請留意,應用了附加的反斜槓作為本義字符,它將 s 婚配字符類中的反斜槓指定為原義字符。
Regex r; // 聲明一個 Regex類的變量 r = new Regex("\s2000"); // 界說表達式
3.2 Match 類表現正則表達式婚配操作的成果
以下示例應用 Regex 類的 Match 辦法前往 Match 類型的對象,以便找到輸出字符串中第一個婚配。此示例應用 Match 類的 Match.Success 屬性來指導能否已找到婚配。
Regex r = new Regex("abc"); // 界說一個Regex對象實例 Match m = r.Match("123abc456"); // 在字符串中婚配 if (m.Success) { Console.WriteLine("Found match at position " + m.Index); //輸出婚配字符的地位 }
3.3 MatchCollection 類表現非堆疊婚配的序列
該聚集為只讀的,而且沒有公共結構函數。MatchCollection 的實例是由 Regex.Matches 屬性前往的。應用 Regex 類的 Matches 辦法,經由過程在輸出字符串中找到的一切婚配填充 MatchCollection。上面代碼示例演示了若何將聚集復制到一個字符串數組(保存每婚配)和一個整數數組(指導每婚配的地位)中。
MatchCollection mc; String[] results = new String[20]; int[] matchposition = new int[20]; Regex r = new Regex("abc"); //界說一個Regex對象實例 mc = r.Matches("123abc4abcd"); for (int i = 0; i < mc.Count; i++) //在輸出字符串中找到一切婚配 { results = mc.Value; //將婚配的字符串添在字符串數組中 matchposition = mc.Index; //記載婚配字符的地位 }
3.4 GroupCollection 類表現捕捉的組的聚集
該聚集為只讀的,而且沒有公共結構函數。GroupCollection 的實例在 Match.Groups 屬性前往的聚集中前往。上面的掌握台運用法式查找並輸入由正則表達式捕捉的組的數量。
using System; using System.Text.RegularExpressions; public class RegexTest { public static void RunTest() { Regex r = new Regex("(a(b))c"); //界說組 Match m = r.Match("abdabc"); Console.WriteLine("Number of groups found = " + m.Groups.Count); } public static void Main() { RunTest(); } }
該示例發生上面的輸入:
Number of groups found = 3
3.5 CaptureCollection 類表現捕捉的子字符串的序列
因為限制符,捕捉組可以在單個婚配中捕捉多個字符串。Captures屬性(CaptureCollection 類的對象)是作為 Match 和 group 類的成員供給的,以便於對捕捉的子字符串的聚集的拜訪。例如,假如應用正則表達式 ((a(b))c)+(個中 + 限制符指定一個或多個婚配)從字符串"abcabcabc"中捕捉婚配,則子字符串的每婚配的 Group 的 CaptureCollection 將包括三個成員。
上面的法式應用正則表達式 (Abc)+來查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一個或多個婚配,闡釋了應用 Captures 屬性來前往多組捕捉的子字符串。
using System; using System.Text.RegularExpressions; public class RegexTest { public static void RunTest() { int counter; Match m; CaptureCollection cc; GroupCollection gc; Regex r = new Regex("(Abc)+"); //查找"Abc" m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //設定要查找的字符串 gc = m.Groups; //輸入查找組的數量 Console.WriteLine("Captured groups = " + gc.Count.ToString()); // Loop through each group. for (int i=0; i < gc.Count; i++) //查找每個組 { cc = gc.Captures; counter = cc.Count; Console.WriteLine("Captures count = " + counter.ToString()); for (int ii = 0; ii < counter; ii++) { // Print capture and position. Console.WriteLine(cc[ii] + " Starts at character " + cc[ii].Index); //輸出捕捉地位 } } } public static void Main() { RunTest(); } }
此例前往上面的輸入成果:
Captured groups = 2 Captures count = 1 AbcAbcAbc Starts at character 3 Captures count = 3 Abc Starts at character 3 Abc Starts at character 6 Abc Starts at character 9
3.6 Capture 類包括來自單個子表達式捕捉的成果
在 Group 聚集中輪回,從 Group 的每成員中提取 Capture 聚集,而且將變量 posn 和 length 分離分派給找到每字符串的初始字符串中的字符地位,和每字符串的長度。
Regex r; Match m; CaptureCollection cc; int posn, length; r = new Regex("(abc)*"); m = r.Match("bcabcabc"); for (int i=0; m.Groups.Value != ""; i++) { cc = m.Groups.Captures; for (int j = 0; j < cc.Count; j++) { posn = cc[j].Index; //捕捉對象地位 length = cc[j].Length; //捕捉對象長度 } }
把組合字符組合起來後,每次都邑前往一個組對象,便可能其實不是我們願望的成果。假如願望把組合字符作為搜刮形式的一部門,就會有相當年夜的體系開支。關於單個的組,可以用以字符序列"?:"開首的組制止這麼做,就像URI樣例那樣。而關於一切的組,可以在RegEx.Matches()辦法上指定RegExOptions.ExplicitCapture標記。
願望經由過程本文對正則表達式的引見,可以或許給你帶來贊助。