日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 正則表達式

發布時間:2024/10/8 C# 122 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 正則表達式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是正則表達式


???? 正則表達式是用來檢驗和操作字符串的強大工具。簡單的理解正則表達式可以認為是一種特殊的驗證字符串。正則表達式常見運用是驗證用戶輸入信息格式,比如上面的那組“\w{1,}@\w{1,}\.\w{1”,實際上就是驗證郵件地址是否合法的;當然正則表達式不僅僅是用于驗證,可以說只要運用字符串的地方都可以使用正則表達式;


涉及的基本的類


???? 正則表達式在英文中寫作(Regular Expression),根據正則表達式的使用范圍和單詞意思,.NET將其命名空間設置為System.Text.RegularExpressions;


???? 在該命名空間內包括了8個基本的類:Capture、CaptureCollection、Group、GroupCollection、Match、MatchCollection、Regex和RegexCompilationInfo如圖1所示;


圖1 MSDN Library中正則表達式命名空間

?


Capture用于單個表達式捕獲結果
CaptureCollection用于一個序列進行字符串捕獲
Group表示單個捕獲的結果
GroupCollection表示捕獲組的集會
Match表示匹配單個正則表達式結果
MatchCollection表示通過迭代方式應用正則表達式到字符串中
Regex表示不可變的正則表達式
RegexCompilationInfo將編譯正則表達式需要提供信息


[注意]

???? 本文屬于初學正則表達式的入門文章,對于高級的分組(Group)及其涉及語法等在這里不做介紹;



正則表達式基礎知識


  • 基本語法

???? 在正則表達式中擁有一套自己的語法規則,常見語法包括;字符匹配、重復匹配、字符定位、轉義匹配和其他高級語法(字符分組、字符替換和字符決策);


???? 字符匹配語法:


字符語法語法解釋語法例子
\d匹配數字(0~9)‘\d’匹配8,不匹配12;
\D匹配非數字‘\D’匹配c,不匹配3;
\w匹配任意單字符‘\w\w’ 匹配A3,不匹配@3;
\W匹配非單字符‘\W’匹配@,不匹配c;
\s匹配空白字符‘\d\s\d’匹配3 d,不匹配abc;
\S匹配非空字符‘\S\S\S’匹配A#4,不匹配3 d;
.匹配任意字符‘....’匹配A$ 5,不匹配換行;
[…]匹配括號中任意字符[b-d]匹配b、c、d, 不匹配e;
[^…]匹配非括號字符[^b-z]匹配a,不匹配b-z的字符;

???? 重復匹配語法:


重復語法語法解釋語法例子
{n}匹配n次字符\d{3}匹配\d\d\d,不匹配\d\d或\d\d\d\d
{n,}匹配n次和n次以上\w{2}匹配\w\w和\w\w\w以上,不匹配\w
{n,m}匹配n次上m次下\s{1,3}匹配\s,\s\s,\s\s\s,不匹配\s\s\s\s
?匹配0或1次5?匹配5或0,不匹配非5和0
+匹配一次或多次\S+匹配一個以上\S,不匹配非一個以上\S
*匹配0次以上\W*匹配0以上\W,不匹配非N*\W

???? 字符定位語法:


重復語法語法解釋語法例子
^定位后面模式開始位置
$前面模式位于字符串末端
\A前面模式開始位置
\z前面模式結束位置
\Z前面模式結束位置(換行前)
\b匹配一個單詞邊界
\B匹配一個非單詞邊界

???? 轉義匹配語法:


轉義語法涉及字符(語法解釋)語法例子
“\”+實際字符\ . * + ? | ( ) { }^ $例如:\\匹配字符“\”
\n匹配換行
\r匹配回車
\t匹配水平制表符
\v匹配垂直制表符
\f匹配換頁
\nnn匹配一個8進制ASCII
\xnn匹配一個16進制ASCII
\unnnn匹配4個16進制的Uniode
\c+大寫字母匹配Ctrl-大寫字母例如:\cS-匹配Ctrl+S

  • 構造正則表達的方法

???? 構造正則表達式需要涉及Regex類,在Regex類中包括:IsMatch()、Replace()、Split()和Match的類;


(1) IsMatch()方法;


???? IsMatch()方法實際上是一個返回Bool值得方法,如果測試字符滿足正則表達式返回True否則返回False;



例1;判斷是非成都地區電話號碼合法;

分析:成都地區電話號碼組成028********,前面為固定區號028,后面滿足8位數字;

設計正則表達式:028\d{8}(解釋:028區號固定,后面為8個數字\d組成);

程序代碼,如圖2所示:

?


圖2 “例1” IsMatch方法是用例

(2) Replace()方法;


???? Replace()方法實際上是一種替換的方法,替換匹配正則表達式匹配模式;



例2:在發布帶有公開電子郵件地址的文章時,替換@位AT避免產生垃圾郵件;

分析:首先需要判斷文章中電子郵箱地址,然后執行替換

設計正則表達式:判斷電子郵箱表達式”\w{1,}@w{1,}\\.”;

程序代碼:如圖3所示;

?


圖3 “例2”Replace方法是用例

(3) Split()方法;


???? Split()方法實際上是拆分的方法,根據匹配正則表達式進行拆分儲存在字符串數組中;



例3:從群發郵件地址中讀取所有郵件地址;

分析:群發郵件采用“;”作為分割符,需要通過“;”進行拆分

程序代碼:如圖4所示;

?


圖4 “例3”Split方法是用例

構建表達式基本方法


???? 構造Regex對象的構造函數包括兩個重載,一個是不含參數的構造、另外一個是含有參數的構造函數;



  • 基本形式Regex(string pattern);
  • 重載形式Regex(string pattern,RegexOptions);

????補充:RegexOptions屬于枚舉類型,包括IgnoreCase(忽略大小寫)、ReghtToLeft(從右向左)、None(默認)、CultureInvariant(忽略區域)、Multline(多行模式)和SingleLine(單行模式);



例4,建立一個合法ISBN驗證格式;

分析:ISBN格式為X-XXXXX-XXX-X;

正則表達式格式:\d-\d{5}-\d{3}-\d

構造該正則表達式函數Regex ISBNRegex = new Regex(表達式,參數為空)

詳細代碼:如圖5所示;

?


圖5 “例4”構造驗證函數是用例

編寫一個檢驗程序


???? 為了方便自己在學習正則表達式和快速檢驗自己編寫表達式語句是否正確,下面提供一個IsMatch()方法正則表達式驗證器編寫;



  • 打開VS.NET,選擇新建項目中的Visual C#項目的Windows應用程序,取名為“Regex_Tools”;
  • 然后編寫如圖6所示的界面

    圖6 正則表達式IsMatch方法驗證器
  • 然后在該窗體聲明中增加正則表達式命名空間聲明using System.Text.RegularExpressions;
  • 編寫下列代碼

  • 編寫一段私有的判斷參數的方法,如圖7所示;

    圖7私有驗證參數判斷方法
  • 編寫判斷按鈕的方法,如圖8所示;

    圖8 IsMatch驗證判斷按鈕方法
  • 編寫清空按鈕的方法,所有的文本框等于空;
  • 編譯該程序,一個簡單的正則表達式驗證器就成功生成了;
  • ?

    ?

    ?

    全面剖析c#正則表達式:

    到目前為止,許多的編程語言和工具都包含對正則表達式的支持,當然.NET也不例外,.NET基礎類庫中包含有一個名稱空間和一系列可以充分發揮規則表達式威力的類。
    ??????? 正則表達式的知識可能是不少編程人員最煩惱的事兒了。如果你還沒有規則表達式方面的知識的話,建議從正則表達式的基礎知識入手。前參見 正則表達式語法

    ??????? 下面就來研究C#中的正則表達式,C#中的正則表達式包含在.NET基礎雷庫的一個名稱空間下,這個名稱空間就是System.Text.RegularExpressions。該名稱空間包括8個類,1個枚舉,1個委托。他們分別是:
    ???????????????????? Capture: 包含一次匹配的結果;
    ???????????????????? CaptureCollection: Capture的序列;
    ????????????????????? Group: 一次組記錄的結果,由Capture繼承而來;
    ????????????????????? GroupCollection:表示捕獲組的集合
    ????????????????????? Match: 一次表達式的匹配結果,由Group繼承而來;
    ????????????????????? MatchCollection: Match的一個序列;
    ????????????????????? MatchEvaluator: 執行替換操作時使用的委托;
    ????????????????????? Regex:編譯后的表達式的實例。
    ????????????????????? RegexCompilationInfo:提供編譯器用于將正則表達式編譯為獨立程序集的信息
    ????????????????????? RegexOptions 提供用于設置正則表達式的枚舉值
    Regex類中還包含一些靜態的方法:
    ??????????????????? Escape: 對字符串中的regex中的轉義符進行轉義;
    ??????????????????? IsMatch: 如果表達式在字符串中匹配,該方法返回一個布爾值;
    ??????????????????? Match: 返回Match的實例;
    ??????????????????? Matches: 返回一系列的Match的方法;
    ??????????????????? Replace: 用替換字符串替換匹配的表達式;
    ??????????????????? Split: 返回一系列由表達式決定的字符串;
    ??????????????????? Unescape:不對字符串中的轉義字符轉義。

    下面介紹他們的用途:
    ??????? 先看一個簡單的匹配例子,我們首先從使用Regex、Match類的簡單表達式開始學習。 Match m = Regex.Match("abracadabra", "(a|b|r)+"); 我們現在有了一個可以用于測試的Match類的實例,例如:if (m.Success){},如果想使用匹配的字符串,可以把它轉換成一個字符串:   MesaageBox.Show("Match="+m.ToString()); 這個例子可以得到如下的輸出: Match=abra。這就是匹配的字符串了。

    ??????? Regex 類表示只讀正則表達式類。它還包含各種靜態方法(在下面的實例中將逐一介紹),允許在不顯式創建其他類的實例的情況下使用其他正則表達式類。

    ??????? 以下代碼示例創建了 Regex 類的實例并在初始化對象時定義一個簡單的正則表達式。聲明一個Regex對象變量:Regex objAlphaPatt;,接著創建Regex對象的一個實例,并定義其規則:objAlphaPatt=new Regex("[^a-zA-Z]");

    ??????? IsMatch方法指示 Regex 構造函數中指定的正則表達式在輸入字符串中是否找到匹配項。這是我們使用C#正則表達式時最常用的方法之一。下面的例子說明了IsMatch方法的使用:
    if( !objAlphaPatt.IsMatch("testisMatchMethod"))
    lblMsg.Text = "匹配成功";
    else
    lblMsg.Text = "匹配不成功";
    這段代碼執行的結果是“匹配成功”
    if( ! objAlphaPatt.IsMatch("testisMatchMethod7654298"))
    lblMsg.Text = "匹配成功";
    else
    lblMsg.Text = "匹配不成功";
    這段代碼執行的結果是“匹配不成功”

    ???????? Escape方法表示把轉義字符作為字符本身使用,而不再具有轉義作用,最小的元字符集(\、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。Replace方法則是用指定的替換字符串替換由正則表達式定義的字符模式的所有匹配項。看下面的例子,還是使用上面定義的Regex對象:objAlphaPatt.Replace("this [test] ** replace and escape" ,Regex.Escape("()"));他的返回結果是:this\(\)\(\)test\(\)\(\)\(\)\(\)\(\)replace\(\)and\(\)escape,如果不是Escape的話,則返回結果是:this()()test()()()()()replace()and()escape,Unescape 反轉由 Escape 執行的轉換,但是,Escape 無法完全反轉 Unescape。

    ??????? Split方法是把由正則表達式匹配項定義的位置將輸入字符串拆分為一個子字符串數組。例如:
    Regex r = new Regex("-"); // Split on hyphens.
    string[] s = r.Split("first-second-third");
    for(int i=0;i<s.Length;i++)
    {
    Response.Write(s[i]+"<br>");
    }

    執行的結果是:
    First
    Second
    Third

    ??????? 看上去和String的Split方法一樣,但string的Split方法在由正則表達式而不是一組字符確定的分隔符處拆分字符串。

    ??????? Match方法是在輸入字符串中搜索正則表達式的匹配項,并Regex 類的 Match 方法返回 Match 對象,Match 類表示正則表達式匹配操作的結果。下面的例子演示Match方法的使用,并利用Match對象的Group屬性返回Group對象:

    string text = @"public string testMatchObj string s string match ";
    string pat = @"(\w+)\s+(string)";
    // Compile the regular expression.
    Regex r = new Regex(pat, RegexOptions.IgnoreCase);
    // Match the regular expression pattern against a text string.
    Match m = r.Match(text);
    int matchCount = 0;
    while (m.Success)
    {
    Response.Write("Match"+ (++matchCount) + "<br>");
    for (int i = 1; i <= 2; i++)
    {
    ?? Group g = m.Groups[i];
    ?? Response.Write("Group"+i+"='" + g + "'" + "<br>");
    ?? CaptureCollection cc = g.Captures;
    ?? for (int j = 0; j < cc.Count; j++)
    ?? {
    ??? Capture c = cc[j];
    ??? Response.Write("Capture"+j+"='" + c + "', Position="+c.Index + "<br>");
    ?? }
    }
    m = m.NextMatch();
    }

    該事例運行結果是:
    Match1
    Group1='public'
    Capture0='public', Position=0
    Group2='string'
    Capture0='string', Position=7
    Match2
    Group1='testMatchObj'
    Capture0='testMatchObj', Position=14
    Group2='string'
    Capture0='string', Position=27
    Match3
    Group1='s'
    Capture0='s', Position=34
    Group2='string'
    Capture0='string', Position=36

    ??????? MatchCollection 類表示成功的非重疊匹配的只讀的集合,MatchCollection 的實例是由 Regex.Matches 屬性返回的,下面的實例說明了通過在輸入字符串中找到所有與Regex中指定的匹配并填充 MatchCollection。

    MatchCollection mc;
    Regex r = new Regex("match");
    mc = r.Matches("matchcollectionregexmatchs");
    for (int i = 0; i < mc.Count; i++)
    {
    Response.Write( mc[i].Value + " POS:" + mc[i].Index.ToString() + "<br>");
    }
    該實例運行的結果是:
    match POS:0
    match POS:20

    轉載于:https://www.cnblogs.com/Mayvar/archive/2011/04/01/a_1.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的C# 正則表達式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。