1. 程式人生 > >C#正則表示式Regex類使用

C#正則表示式Regex類使用

作為文字處理的利器——Perl語言對正則表示式的最強大支援起到了重要的作用,正因為如此,許多其他語言在加入正則表示式引擎的時候都會或多或少的兼顧perl風格的正則表示式,開發出相應的引擎。本人使用perl語言處理文字有一些時間,同時也有幾年php開發的經歷,像php就有相容perl的正則表示式引擎,其對應的正則表示式函式就是以p為字首,如preg_replace、preg_match、preg_split。.NET 類庫當然也提供了正則表示式的支援,位於System.Text.RegularExpressions名稱空間下的Regex類封裝了所有正則表示式的屬性和使用方法。本文以C#語言詳細敘述一下.NET類庫下的這個Regex類,可以發現所有的語言對正則表示式的支援都是萬變不離其宗,以類比推理的方式學習非常好。

使用過正則表示式的朋友都知道,正則表示式就是指定一個規則去處理一些複雜的文字(如果是簡單的處理可以使用一般語言內建的字串處理函式就可以了,而且效率會更好)。這樣需要達到的效果無非就是用一個模式去替換字串中的特定項為另一特定項用一個模式去匹配文字中感興趣的部分內容用一個特殊的模式去拆分文字

  • 建構函式:用於構造一個正則表示式物件,原始碼的宣告如下:

其中宣告為public的建構函式是可以直接使用的,前者使用一個正則表示式字串構造,後者使用正則表示式字串和表示式選項構造物件。其中正則表示式選項RegexOptions是一個列舉型別,用於設定正則表示式的模式修正,C#的這個選項有如下專案: Multiline —— 將字串視為多行,“.”就不能匹配換行符(掩碼為2)
Singleline—— 將字串視為單行,“.”就可以匹配換行符(掩碼為16) IgnorePatternWhitespace —— 忽略模式表示式中的非轉義空白,並啟用#表示的註釋(掩碼為32) None —— 不設定選項(掩碼為0) IgnoreCase —— 忽略字串中的大小寫(掩碼為1) RightToLeft —— 將預設的從左至右的搜尋改為從右至左(掩碼為64) Compiled —— 將正則表示式編譯為程式集,可以加快執行速度,但是會增加啟動時間(掩碼為8) CultureInvariant —— 忽略語言中的區域性差異(掩碼為512)
ExplicitCapture —— 指定有效的捕獲僅為形式為 (?<name>...) 的顯式命名或編號的組,使得未命名的圓括號可以充當非捕獲組(掩碼為4)
ECMAScript —— 為表示式啟用符合 ECMAScript 的行為,只能與IgnoreCase、Multiline和Compiled選項一起使用(掩碼為256) 上述選項都是使用掩碼方式儲存的,因此多個選項選擇的時候直接使用按位與“|”操作符連線起來即可。
  • 匹配(Match):使用模式進行匹配的時候,.NET提供了IsMatch和Match以及Matches三個函式,第一個返回布林值用來表示是否匹配成功,第二個則是返回匹配得到的結果Match物件,包含了匹配的結果內容,第三個則是返回一個Match物件的集合,包含了所有匹配的物件。上述函式的所有宣告如下:

IsMatch提供了一個對輸入字串進行匹配和指定起始位置匹配,同時也提供了對應的靜態函式,用於省去構造物件的麻煩,直接傳入模式進行匹配。使用如下程式碼得到的結果如下圖。
            string text = @"12345qwert";
            if (Regex.IsMatch(text, @"[\d]+"))
            {
                Console.WriteLine("success");
            }
            else
            {
                Console.WriteLine("fail");
            }

Match函式也是同樣的提供了輸入字串匹配,和指定起始位置開始匹配,或者同事指定匹配長度。對應的靜態版本類似。匹配成功返回的是一個Match物件,包含了如下資訊:包含的匹配資訊Capture、匹配得到的對應的分組資訊Group,Capture包含了匹配得到的字串Value、長度Length和在源字串中的起始位置Index,Group則擁有組名稱、是否成功Success,同時Match物件包含了NextMatch屬性用於只想下一個匹配得到的Match物件(如果有多個匹配成功項的話),還有Result方法用一個字串去替換當前匹配到的字串。Match函式僅返回匹配到的第一個分組,也就是分組0,整個正則表示式匹配到的整體。 Matches函式則是同樣提供了輸入字串和指定起始位置開始,返回匹配得到的所有Match物件集合。
            string text = @"12345qwert67890";
            Regex rg = new Regex( @"(?<first>[\d])\d+");
            if (rg.IsMatch(text,0))
            {
                MatchCollection mts = rg.Matches(text,0);
                foreach(Match mt in mts )
                {
                    Console.WriteLine("success:" + mt.Value);
                }
            }
            else
            {
                Console.WriteLine("fail");
            }


  • 替換(Replace):其實在Match函式中也提供了Result方法用來替換匹配項,但是功能不夠充分,以下是Regex類中的替換方法:

替換方法Replace方法可以直接對輸入文字替換成給定的文字,也有指定替換次數和起始位置。同時可以使用MatchEvaluator物件進行替換,此物件使用Replace單詞匹配到的Match物件為引數的一個委託,對每個匹配項進行替換。對於簡單的替換可以直接使用字串引數替換匹配項以及指定替換次數或者起始位置,但是對於複雜的匹配則要使用MatchEvaluator委託進行,可以參考http://www.dotnetperls.com/regex-replace
  • 分割(Split):分割為找到匹配項後以此階段源字串,返回字元陣列。定義如下:

這個方法的定義比較簡單,就是找到匹配項然後從此字串拆分獲取拆分的結果,同時可以指定拆分的陣列元素個數。測試如下:
            string text = @"12345qwert67890";
            Regex rg = new Regex( @"(?<first>[\d])\d+");
            string [] strArr = rg.Split(text,10);
            foreach(string str in strArr )
            {
                Console.WriteLine("success:{0}", str);
            }

從上述圖中結果可以看出,對於有分組的時候,是按照源字串中的位置順序進行匹配都進行拆分。 除上述內容外,.NET的Regex類還提供瞭如下方法: Unescape / Escape—— 轉換輸入字串中的任何轉義字元 /  轉換普通字元為轉義字元 CompileToAssembly —— 將一個或多個指定的Regex 物件編譯為命名程式集
GroupNameFromNumber / GroupNumberFromName —— 對命名過的分組得到組號或者相反操作
GetGroupNames / GetGroupNumbers —— 返回匹配到的多組匹配項的組號或組名

相關推薦

C#表示式Regex的使用

C#中為正則表示式的使用提供了非常強大的功能,這就是Regex類。這個包包含於System.Text.RegularExpressions名稱空間下面,而這個名稱空間所在DLL基本上在所有的專案模板中都不需要單獨去新增引用,可以直接使用。 1、定義一個Regex類的例項

C#表示式Regex使用

作為文字處理的利器——Perl語言對正則表示式的最強大支援起到了重要的作用,正因為如此,許多其他語言在加入正則表示式引擎的時候都會或多或少的兼顧perl風格的正則表示式,開發出相應的引擎。本人使用perl語言處理文字有一些時間,同時也有幾年php開發的經歷,像php就有相容

關於C#表示式MatchCollection的總結

認識MatchCollection 類 表示通過以迭代方式將正則表示式模式應用於輸入字串所找到的成功匹配的集合。 名稱空間:  System.Text.RegularExpressions 屬性:Count  獲取匹配項的數目。  方法:ToString  返回表示當

C#表示式(Regex)

class Program { //------------------[A-Za-z]+[0-9]---密碼 //[A-Za-z] 匹配字母大小寫 //+ 匹配一個或多個前面的字元(字母大小寫)

C# 中使用表示式 Regex.Matches方法的幾個應用

用於正則表示式的 Regex.Matches靜態方法的幾種用法: //①正則表示式 = > 匹配字串 string Text = @"This is a book , this is my book , Is not I

C#表示式程式設計(三):Match和Group用法

前面兩篇講述了正則表示式的基礎和一些簡單的例子,這篇將稍微深入一點探討一下正則表示式分組,在.NET中正則表示式分組是用Match類來代表的。首先先看一段程式碼:/// <summary> /// 顯示Match內多個Group的例子 /// </summa

C#拾遺】——表示式RegEx

前提     公司內部推行安全制度,要求密碼必須是八位以上,而且必有至少包含一個小寫或者大寫字母,數字,特殊字元,面對這樣的密碼,感覺領導也是夠操心的了啊。在公司小編真是閒啊,所以動手實現了一下,後來

JavaSE_day9_常用API_Object_String_StringBuffer_表示式_Date_DateFormat_Calendar_基本資料型別包裝

1.Object類 是Java語言中的根類,即所有類的父類。它中描述的所有方法子類都可以使用。所有類在建立物件的時候,最終找的父類就是Object 方法: equals方法,用於比較兩個物件是否相同,它其實就是使用兩個物件的記憶體地址在比較。Object類中的equals方法內部使用的就

C# 表示式的一些語法筆記

基礎語法看這裡:正則表示式語法 下面是一些其他要注意的點…… 反斜槓 + 元字元 表示匹配元字元本身。 eg:元字元 . 表示除換行符以外的任意字元,而 \. 表示匹配 . 。 一般定義正則表示式字串時會加上 @,表示不轉義。 eg:string patt

C#表示式簡單總結

C#: c#中驗證正則表示式的類為System.Text.RegularExpressions.Regex 簡單的匹配方法為IsMatch(4個過載方法) 正則表示式語法: 一、匹配單個字元 [ ]:從中選擇一個字元匹配 如:單詞字元([ae])、非單詞

表示式 Regex 複習筆記

正則表示式使用目標是操作字串。 語法規則: [abc]: a, b, c 中任意一個字元; [^abc]: 除a,b,c 外的任意一個字元; [a-zA-Z]: 從 a 到 z,A 到 Z 中的任意一個字元; [a-d[m-p]]: a-d 與 m-p 的並集; [a-d&&

C# -- 表示式匹配字元之含義

原文: C# -- 正則表示式匹配字元之含義 C#正則表示式匹配字元之含義 1.正則表示式的作用:用來描述字串的特徵。 2.各個匹配字元的含義: .   :表示除\n以外的單個字元 [ ]  :表示在字元陣列[]中羅列出來的字元任意取單個 |   :表示“或”的意思

C# 表示式檢查輸入字元

public class Validator 2 { 3 #region 匹配方法 4 /// <summary> 5 /// 驗證字串是否匹配正則表示式描述的規則 6

表示式工具

1.  正則表示式匹配兩個指定字串中間的內容 public static List<String> getSubUtil(String soap,String rgex){ List<String> list = new ArrayList

C 表示式的完全匹配 部分匹配及忽略大小寫的問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java 知識點整理-8.表示式+Math+Random+System+BigInteger+BigDecimal+Date+SimpleDateFormat+Calendar

目錄 正則表示式 Math類 Random類 System類  BigInteger類 BigDecimal類 Date類(日期類) DateFormat類 SimpleDateFormat類 Calendar類 正則表示式 1、正則

Java中表示式相關Pattern和Matcher的使用

在Java中,java.util.regex包定義了正則表示式使用到的相關類,其中最主要的兩個類為:Pattern、Matcher:   Pattern 編譯正則表示式後建立一個匹配模式;   Matcher 使用Pattern例項提供的正則表示式對目標字串進行匹

C#表示式入門(下)

一、匹配郵政編碼,郵政編碼為6位數字組成。 string code; code = Console.ReadLine(); Regex reg = new Regex(@"^\d{6}$",RegexOptions.None); Console.WriteLine(reg.IsMat

C#表示式入門(中)

一、忽略匹配優先模式 *? 重複任意次,但儘可能少重複 +? 重複1次或更多次,但儘可能少重複 ?? 重複0次或1次,但儘可能少重複 {n,m}? 重複n到m次,但儘可能少重複 {n,}? 重複n次以上,但儘可能少重複   【例二】在滿足匹配時

C#表示式入門(上)

一、說明 使用正則表示式 需要包含名字空間using System.Text.RegularExpressions; .Net使用的是傳統型NFA引擎,.NET正則表示式流派概述 分類 舉例 字元縮略表示法