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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET核心正则类详解

發布時間:2024/8/22 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET核心正则类详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:感謝大家對上一篇文章的支持,真的很高興自己的文章可以對大家帶來一點好處,謝謝各位.

?????.今天的講解分為以下部分:

?????1.核心對象概述

?????2.核心對象詳解

?????首先看第一部分:?1.核心對象概述

?????在.NET中,正則功能是通過7個類的高度交互來提供的,但是我們只要掌握其中的3個類就可以完成絕大部分功能,所以我們來看看這3個類.

??????????1.1Regex對象:

???????????首先我們創建Regex對象:

Code
Regex?regex=new?Regex(@"\s+(\d)$");

????????????創建對象后就可以去匹配字符文本了,此時要調用Match方法:

Code
Match?match=regex.Macth("May?16,2007");

??????????????請大家注意返回的類型!

??????????1.2Match對象

??????????Regex對象的Match方法通過創建并且返回 Match對象來提供匹配的信息.Match對象有很多的屬性,如Success,表示匹配是否成功,是bool類型的.還有Value屬性,如果匹配成功,那么那么Value就保存了實際匹配的文本的副本.

??????????Match對象返回的細節還包含捕獲括號所匹配的文本..NET中用兩種方法來取得匹配后的捕獲文本:用Match對象的Groups[i].Value(i是一個數字),還可

以用Result方法.這些我們在后面會談論的.

?????

??????????1.3Group對象

???????????????我們前面談了一些關于Groups的知識,大家可以猜到,其實Groups就是Group對象的集合,所以Groups[1].Value就是第一個捕獲括號匹配的文本值.每一

組捕獲括號都有一個對應的Group對象.另外還有一個"虛擬分組",其編號為0,它是保存全局的匹配信息的.比如上面的例子中,Groups[0].Value的值就是"May

16,2007",而Groups[1].Value的值就是"16".

???????????????注意:下面例子的match在上面例子中定義了的:

???????????????因此,match.Value和match.Groups[0].Value是等價的--都是全局匹配的文本的副本.第一種方法很簡潔,但是我們要記住有0這個分組因為match.Groups.Count包含了0分組的情況,所以上面的那個例子中match.Groups.Count為2.

???????????????注意:匹配時會計算出所有結果:吧正則表達式應用到字符文本中,得到一個Match對象,此時所有的結果,如匹配的位置,每一個捕獲分組匹配的內容等,都會計算

出來,封裝到一個Match對象中.我們可以訪問那個Match對象的屬性和方法來獲取我們的結果.

??????????2.核心對象詳解?????????

???????????看完上面的部分,大家對一些常用的對象基本有了了解,其實雜實踐中,我們很少明確的聲明Regex 對象,也就是說,我們一般不new一個Regex對象.因為Regex類有很多的靜態方法.

??????????2.1創建Regex對象.????????????

??????????創建一個 Regex對象不難,因為Regex的構造函數比較簡單,可以接受一個參數(作為正則表達式的字符串),前面的例子大家看過.或者接受兩個參數(一個正則表達式,還有一個枚舉的值).下面分別舉例:

?????????????接受一個參數的構造函數:

Code
Regex?regex=new?Regex(@"\s+(\d)$");

??????????????接受兩個兩個參數的構造函數:

?????

Code
//不區分大小寫的匹配?并且匹配多行
Regex?regex=new?Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline);

???????????????大家對后面的那些枚舉的值,可能不是很清楚,下面說下(只說很常用的):

???????????????RegexOptions的取值的意義:

???????????????RegexOptions.IgnoreCase:表示不區分大小寫的匹配;

???????????????RegexOptions.Multiline:表示正則表達式在匹配的時候采用增強的錨點模式,也就是說,可以匹配字符串內部的換行符,不僅僅知識匹配整個字符串的開始和結尾:舉例如下:

???????????????一個字符串,string str="This is a apple.(換行)

????????????????????????????????????????Hello xiaoyang.(換行)

????????????????????????????????????????Hello everyone!"

???????????????(注:大家甚至可以把一篇文章讀入到一個字符串中,文章肯定有很多的行)

???????????????如果我們想匹配str中所有的a,那么你用表達式Regex regex=new Regex(@"^a$");,那么你就只能匹配其中的一行,即你得到匹配是a apple,后面的兩行

沒有匹配,所以你就可以用?RegexOptions.Multiline匹配多行.

???????????????RegexOptions.Singleline:表示只匹配一行.?????????????

???????????????RegexOptions.ExplicitCapture:在正則表達式中,一般括號"()"是捕獲性的括號,即你可以在結果中有Groups[i]來索引相應的值,如果你用了這個枚舉,那

么你的正則表達式中的括號"()"就不是捕獲性的括號了.那么你的括號就只是分組了.但是注意:命名捕獲括號不受影響,即(?<name>...)還是可以捕獲,你可以訪問

Groups["name"].Value來獲得你匹配的文本.

??????????????RegexOptions.RightToLeft?:進行從右向左的匹配,而我們的表達式一般從左向右匹配的.

??????????? ??RegexOptions.Complied?:表示你的正則表達式是否要編譯,就類比我們數據庫中的存儲結構和一般的查詢語句的關系.如果你的正則表達式只用一次,那么

你編譯就沒有什么意義,如果很常用,那么編譯后,以后的匹配就快些.

??????????????上面的枚舉值是很常用的,還有幾個不怎么用,就不說了.其實我們可以在構造函數中使用多個枚舉一起用,如:同時匹配多行,且不區分大小寫,且編譯表達式.你

就可以這樣:

Code

//不區分大小寫的匹配?并且匹配多行,編譯
Regex?regex=new?Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Complied);

??????????注意:用"|"連接,表多個.

?????

??????????上面講了創建Regex對象,下面接著:

??????????2.2使用Regex對象:?????????????

??????????首先我們先創建一個Regex,便于我們下面的講解:

Code

//不區分大小寫的匹配?并且匹配多行,編譯
Regex?regex=new?Regex(@"^\s+(\d)$",RegexOptions.IgnoreCase|RegexOptions.Multiline|RegexOptions.Complied);

????????????我們就可以用這個regex對象來匹配文本了.

????????????2.2.1IsMatch方法:???????????????

????????????這個方法用兩個重載:regex.IsMatch(strString),regex.IsMatch(strString,offSet)

????????????IsMatch方法把目標正則表達式(^\s+(\d)$應用在目標字符串(strString),返回bool的值,表示匹配是否成功,而offSet是一個整數,表示從字符串的那個位

置開始匹配.

??????????

??????????????2.2.2Match方法:??????

??????????????這個方法有3個重載,很簡單的.

????????????????????regex.Match(strString),

????????????????????regex.Match(strString,offSet)

????????????????????regex.Match(strString,offSet,maxlength);

???????????????其中,strString=要匹配的字符串,offSet=開始匹配的位置(int),maxlength=字符串要匹配的長度,可能字符串很長,擔你只是想匹配10個字符.

???????????????Match方法返回一個Match的對象,我們可以通過在返回的對象中獲取我們匹配的信息.

??????????

???????????????注意:如果提供了maxlength參數,會進行特殊的匹配,從offSet開始的字符開始計算,正則表達式引擎會把maxlength長度的文本當作整個目標字符串,并且

假設此范圍之外的字符不存在,所以此時"^"只能匹配字符串中offSet位置,而"$"匹配之后的maxlength個字符的位置.,就算你的正則表達式中有環視,環視也不能"看

到"此范圍之外的字符.

??????????

????????????????2.2.3Matches方法:???????

?????

????????????????其實Matches方法返回一組Match對象,可以類比前面說的Groups 和Group 的關系.

????????????????例子:

??????????

Code
Regex?regex=new?Regex(@"\w+");
string?str="hello?world";
MatchCollection?matchCollection
=regex.Matchs(str);

???????????????在matchCollection中就有兩個match對象,即matchCollection.Count為2,你可以迭代集合對象,用Match的Value屬性來得到匹配為本:Helle? 和World.

???????????????今天就到這里,下一篇就會談談Regex對象稍微高級一點的問題!

作者:小洋,燕洋天

轉載于:https://www.cnblogs.com/qiuweiguo/archive/2011/08/09/2132726.html

總結

以上是生活随笔為你收集整理的.NET核心正则类详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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