Regex c#

來源:互聯網
上載者:User

首先,我們先看幾個實際的例子:
1. 驗證輸入字元是否
javascript:
var ex = "^\\w+$";
var re = new RegExp(ex,"i");
return re.test(str);

VBScript

Dim regEx,flag,ex

ex = "^\w+$"

Set regEx = New RegExp

regEx.IgnoreCase = True

regEx.Global = True

regEx.Pattern = ex

flag = regEx.Test( str )

C#

System.String ex = @"^\w+$";

System.Text.RegularExpressions.Regex reg = new Regex( ex );
bool flag = reg.IsMatch( str );

2. 驗證郵件格式

C#

System.String ex = @"^\w+@\w+\.\w+$";

System.Text.RegularExpressions.Regex reg = new Regex( ex );

bool flag = reg.IsMatch( str );

3. 更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式)

C#

String MDYToDMY(String input)

{

return Regex.Replace(input,

"\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b",

"${day}-${month}-${year}");

}

4. 從 URL 提取協議和連接埠號碼

C#

String Extension(String url)

{

Regex r = new Regex(@"^(?\w+)://[^/]+?(?:\d+)?/",

RegexOptions.Compiled);

return r.Match(url).Result("${proto}${port}");

}

這裡的例子可能是我們在網頁開發中,通常會碰到的一些Regex,尤其在第一個例子中,給出了使用javascript,vbScript,C#等不同語言的實現方式,大家不難看出,對於不同的語言來說,Regex沒有區別,只是Regex的實作類別不同而已。而如何發揮Regex的公用,也要看實作類別的支援。

(摘自msdn: Microsoft .NET 架構 SDK 提供大量的Regex工具,使您能夠高效地建立、比較和修改字串,以及迅速地分析大量文本和資料以搜尋、移除和替換文字模式。ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm)

下面我們逐個來分析這些例子:

1-2,這兩個例子很簡單,只是簡單的驗證字串是否符合Regex規定的格式,其中使用的文法,在第一篇文章中都已經介紹過了,這裡做一下簡單的描述。

第1個例子的運算式: ^\w+$

^ -- 表示限定匹配開始於字串的開始

\w – 表示匹配英文字元

+ -- 表示匹配字元出現1次或多次

$ -- 表示匹配字元到字串結尾處結束

驗證形如asgasdfs的字串

第2個例子的運算式: ^\w+@\w+.\w+$

^ -- 表示限定匹配開始於字串的開始

\w – 表示匹配英文字元

+ -- 表示匹配字元出現1次或多次

@ -- 匹配一般字元@

\. – 匹配一般字元.(注意.為特殊字元,因此要加上\轉譯)

$ -- 表示匹配字元到字串結尾處結束

驗證形如dragontt@sina.com的郵件格式

第3 個例子中,使用了替換,因此,我們還是先來看看Regex中替換的定義:

(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconsubstitutions.htm)

替換
字元
含義

$123
替換由組號 123(十進位)匹配的最後一個子字串。

${name}
替換由 (? ) 組匹配的最後一個子字串。

$$
替換單個“$”字元。

$&
替換完全符合本身的一個副本。

$`
替換匹配前的輸入字串的所有文本。

$'
替換匹配後的輸入字串的所有文本。

$+
替換最後捕獲的組。

$_
替換整個輸入字串。

分組構造
(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpcongroupingconstructs.htm)

分組構造
定義

( )
捕獲匹配的子字串(或非擷取的群組;有關更多資訊,請參閱Regex選項中的 ExplicitCapture 選項。)使用 () 的捕獲根據左括弧的順序從 1 開始自動編號。捕獲元素編號為零的第一個捕獲是由整個Regex模式比對的文本。

(?<name> )
將匹配的子字串捕獲到一個組名稱或編號名稱中。用於 name 的字串不能包含任何標點符號,並且不能以數字開頭。可以使用單引號替代角括弧,例如 (?'name')。

(?<name1-name2> )
平衡組定義。刪除先前定義的 name2 組的定義並在 name1 組中儲存先前定義的 name2 組和當前組之間的間隔。如果未定義 name2 組,則匹配將回溯。由於刪除 name2 的最後一個定義會顯示 name2 的先前定義,因此該構造允許將 name2 組的捕獲堆棧用作計數器以跟蹤嵌套構造(如括弧)。在此構造中,name1 是可選的。可以使用單引號替代角括弧,例如 (?'name1-name2')。

(?: )
非擷取的群組。

(?imnsx-imnsx: )
應用或禁用子運算式中指定的選項。例如,(?i-s: ) 將開啟不區分大小寫並禁用單行模式。有關更多資訊,請參閱Regex選項。

(?= )
零寬度正預測先行斷言。僅當子運算式在此位置的右側匹配時才繼續匹配。例如,\w+(?=\d) 與後跟數位單詞匹配,而不與該數字匹配。此構造不會回溯。

(?! )
零寬度負預測先行斷言。僅當子運算式不在此位置的右側匹配時才繼續匹配。例如,\b(?!un)\w+\b 與不以 un 開頭的單詞匹配。

(?<= )
零寬度正回顧後發斷言。僅當子運算式在此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 後面的 99 的執行個體匹配。此構造不會回溯。

(?
零寬度負回顧後發斷言。僅當子運算式不在此位置的左側匹配時才繼續匹配。

(?> )
非回溯子運算式(也稱為貪婪子運算式)。該子運算式僅完全符合一次,然後就不會逐段參與回溯了。(也就是說,該子運算式僅與可由該子運算式單獨匹配的字串匹配。)

我們還是先簡單的瞭解一下這兩個概念:

分組構造:

最基本的構造方式就是(),在左右括弧中括起來的部分,就是一個分組;

更進一步的分組就是形如:(?<name> )的分組方式,這種方式與第一種方式的不同點,就是對分組的部分進行了命名,這樣就可以通過該組的命名來擷取資訊;

(還有形如(?= )等等的分組構造,我們這篇的例子中也沒有使用到,下次我們在來介紹)

替換:

上面提到了兩種基本的構造分組方式()以及(?<name> ),通過這兩種分組方式,我們可以得到形如$1,${name}的匹配結果。

這樣說,可能概念上還是有些模糊,我們還是結合上面的例子來說:

第三個例子的Regex為:\\b(?\\d{1,2})/(?\\d{1,2})/(?\\d{2,4})\\b

(解釋一下,為什麼這裡都是\\一起用:這裡是C#的例子,在C#語言中\是轉譯字元,要想字串中的\不轉譯,就需要使用\\或者在整個字串的開始加上@標記,即上面等價與

@”\b(?\d{1,2})/(?\d{1,2})/(?\d{2,4}\b”)

\b -- 是一種特殊情況。在Regex中,除了在 [] 字元類中表示退格符以外,\b 表示字邊界(在 \w 和 \W 字元之間)。在替換模式中,\b 始終表示退格符

(?\d{1,2}) – 構造一個名為month的分組,這個分組匹配一個長度為1-2的數字

/ -- 匹配普通的/字元

(?\d{1,2}) --構造一個名為day的分組,這個分組匹配一個長度為1-2的數字

/ -- 匹配普通的/字元

(?\d{2,4}\b”) --構造一個名為year的分組,這個分組匹配一個長度為2-4的數字

這裡還不能夠看出這些分組的作用,我們接著看這一句

${day}-${month}-${year}

${day} – 獲得上面構造的名為day的分組匹配後的資訊

- -- 普通的-字元

${month} --獲得上面構造的名為month的分組匹配後的資訊

- -- 普通的-字元

${year} --獲得上面構造的名為year的分組匹配後的資訊

舉例來說:

將形如04/02/2003的日期使用例3種的方法替換

(?\d{1,2}) 分組將匹配到04由${month}得到這個匹配值

(?\d{1,2}) 分組將匹配到02由${day}得到這個匹配值

(?\d{1,2}) 分組將匹配到2003由${year}得到這個匹配值

瞭解了這個例子後,我們在來看第4個例子就很簡單了。

第4個例子的正則

^(?\w+)://[^/]+?(?:\d+)?/

^ -- 表示限定匹配開始於字串的開始

(?\w+) – 構造一個名為proto的分組,匹配一個或多個字母

: -- 普通的:字元

// -- 匹配兩個/字元

[^/] – 表示這裡不允許是/字元

+? – 表示指定儘可能少地使用重複但至少使用一次匹配

(?:\d+) – 構造一個名為port的分組,匹配形如:2134(冒號+一個或多個數字)

? – 表示匹配字元出現0次或1次

/ -- 匹配/字元

最後通過${proto}${port}來擷取兩個分組構造的匹配內容

(有關Regex對象的用法,參考

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.