国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Regex > 正文

正則表達(dá)式 c#

2020-03-16 21:23:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
首先,我們先看幾個(gè)實(shí)際的例子: 
1.    驗(yàn)證輸入字符是否
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.    驗(yàn)證郵件格式

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 提取協(xié)議和端口號(hào)

C#

String Extension(String url) 

   {

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

         RegexOptions.Compiled);

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

   }

這里的例子可能是我們?cè)诰W(wǎng)頁(yè)開(kāi)發(fā)中,通常會(huì)碰到的一些正則表達(dá)式,尤其在第一個(gè)例子中,給出了使用javascript,vbScript,C#等不同語(yǔ)言的實(shí)現(xiàn)方式,大家不難看出,對(duì)于不同的語(yǔ)言來(lái)說(shuō),正則表達(dá)式?jīng)]有區(qū)別,只是正則表達(dá)式的實(shí)現(xiàn)類(lèi)不同而已。而如何發(fā)揮正則表達(dá)式的公用,也要看實(shí)現(xiàn)類(lèi)的支持。

(摘自msdn: Microsoft .NET 框架 SDK 提供大量的正則表達(dá)式工具,使您能夠高效地創(chuàng)建、比較和修改字符串,以及迅速地分析大量文本和數(shù)據(jù)以搜索、移除和替換文本模式。ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm)

下面我們逐個(gè)來(lái)分析這些例子:

1-2,這兩個(gè)例子很簡(jiǎn)單,只是簡(jiǎn)單的驗(yàn)證字符串是否符合正則表達(dá)式規(guī)定的格式,其中使用的語(yǔ)法,在第一篇文章中都已經(jīng)介紹過(guò)了,這里做一下簡(jiǎn)單的描述。

第1個(gè)例子的表達(dá)式:  ^/w+$

^ -- 表示限定匹配開(kāi)始于字符串的開(kāi)始

         /w – 表示匹配英文字符

         + -- 表示匹配字符出現(xiàn)1次或多次

         $ -- 表示匹配字符到字符串結(jié)尾處結(jié)束

         驗(yàn)證形如asgasdfs的字符串

第2個(gè)例子的表達(dá)式:  ^/w+@/w+./w+$

^ -- 表示限定匹配開(kāi)始于字符串的開(kāi)始

/w – 表示匹配英文字符

+ -- 表示匹配字符出現(xiàn)1次或多次

@ -- 匹配普通字符@

/. – 匹配普通字符.(注意.為特殊字符,因此要加上/轉(zhuǎn)譯)

$ -- 表示匹配字符到字符串結(jié)尾處結(jié)束

驗(yàn)證形如dragontt@sina.com的郵件格式

 

 

     第3 個(gè)例子中,使用了替換,因此,我們還是先來(lái)看看正則表達(dá)式中替換的定義:

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

替換
字符
含義

$123
替換由組號(hào) 123(十進(jìn)制)匹配的最后一個(gè)子字符串。

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

$$
替換單個(gè)“$”字符。

$&
替換完全匹配本身的一個(gè)副本。

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

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

$+
替換最后捕獲的組。

$_
替換整個(gè)輸入字符串。



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

分組構(gòu)造
定義

( )
捕獲匹配的子字符串(或非捕獲組;有關(guān)更多信息,請(qǐng)參閱正則表達(dá)式選項(xiàng)中的 ExplicitCapture 選項(xiàng)。)使用 () 的捕獲根據(jù)左括號(hào)的順序從 1 開(kāi)始自動(dòng)編號(hào)。捕獲元素編號(hào)為零的第一個(gè)捕獲是由整個(gè)正則表達(dá)式模式匹配的文本。

(?<name> )
將匹配的子字符串捕獲到一個(gè)組名稱(chēng)或編號(hào)名稱(chēng)中。用于 name 的字符串不能包含任何標(biāo)點(diǎn)符號(hào),并且不能以數(shù)字開(kāi)頭。可以使用單引號(hào)替代尖括號(hào),例如 (?'name')。

(?<name1-name2> )
平衡組定義。刪除先前定義的 name2 組的定義并在 name1 組中存儲(chǔ)先前定義的 name2 組和當(dāng)前組之間的間隔。如果未定義 name2 組,則匹配將回溯。由于刪除 name2 的最后一個(gè)定義會(huì)顯示 name2 的先前定義,因此該構(gòu)造允許將 name2 組的捕獲堆棧用作計(jì)數(shù)器以跟蹤嵌套構(gòu)造(如括號(hào))。在此構(gòu)造中,name1 是可選的。可以使用單引號(hào)替代尖括號(hào),例如 (?'name1-name2')。

(?: )
非捕獲組。

(?imnsx-imnsx: )
應(yīng)用或禁用子表達(dá)式中指定的選項(xiàng)。例如,(?i-s: ) 將打開(kāi)不區(qū)分大小寫(xiě)并禁用單行模式。有關(guān)更多信息,請(qǐng)參閱正則表達(dá)式選項(xiàng)。

(?= )
零寬度正預(yù)測(cè)先行斷言。僅當(dāng)子表達(dá)式在此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,/w+(?=/d) 與后跟數(shù)字的單詞匹配,而不與該數(shù)字匹配。此構(gòu)造不會(huì)回溯。

(?! )
零寬度負(fù)預(yù)測(cè)先行斷言。僅當(dāng)子表達(dá)式不在此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,/b(?!un)/w+/b 與不以 un 開(kāi)頭的單詞匹配。

(?<= )
零寬度正回顧后發(fā)斷言。僅當(dāng)子表達(dá)式在此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。例如,(?<=19)99 與跟在 19 后面的 99 的實(shí)例匹配。此構(gòu)造不會(huì)回溯。

(?
零寬度負(fù)回顧后發(fā)斷言。僅當(dāng)子表達(dá)式不在此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。

(?> )
非回溯子表達(dá)式(也稱(chēng)為貪婪子表達(dá)式)。該子表達(dá)式僅完全匹配一次,然后就不會(huì)逐段參與回溯了。(也就是說(shuō),該子表達(dá)式僅與可由該子表達(dá)式單獨(dú)匹配的字符串匹配。)



 

我們還是先簡(jiǎn)單的了解一下這兩個(gè)概念:

分組構(gòu)造:

最基本的構(gòu)造方式就是(),在左右括號(hào)中括起來(lái)的部分,就是一個(gè)分組;

更進(jìn)一步的分組就是形如:(?<name> )的分組方式,這種方式與第一種方式的不同點(diǎn),就是對(duì)分組的部分進(jìn)行了命名,這樣就可以通過(guò)該組的命名來(lái)獲取信息;

(還有形如(?= )等等的分組構(gòu)造,我們這篇的例子中也沒(méi)有使用到,下次我們?cè)趤?lái)介紹)

替換:

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

 

       這樣說(shuō),可能概念上還是有些模糊,我們還是結(jié)合上面的例子來(lái)說(shuō):

第三個(gè)例子的正則表達(dá)式為://b(?//d{1,2})/(?//d{1,2})/(?//d{2,4})//b

(解釋一下,為什么這里都是//一起用:這里是C#的例子,在C#語(yǔ)言中/是轉(zhuǎn)譯字符,要想字符串中的/不轉(zhuǎn)譯,就需要使用//或者在整個(gè)字符串的開(kāi)始加上@標(biāo)記,即上面等價(jià)與

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

/b --  是一種特殊情況。在正則表達(dá)式中,除了在 [] 字符類(lèi)中表示退格符以外,/b 表示字邊界(在 /w 和 /W 字符之間)。在替換模式中,/b 始終表示退格符

(?/d{1,2}) – 構(gòu)造一個(gè)名為month的分組,這個(gè)分組匹配一個(gè)長(zhǎng)度為1-2的數(shù)字

/ -- 匹配普通的/字符

(?/d{1,2}) --構(gòu)造一個(gè)名為day的分組,這個(gè)分組匹配一個(gè)長(zhǎng)度為1-2的數(shù)字

/ -- 匹配普通的/字符

(?/d{2,4}/b”) --構(gòu)造一個(gè)名為year的分組,這個(gè)分組匹配一個(gè)長(zhǎng)度為2-4的數(shù)字

 

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

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

${day} – 獲得上面構(gòu)造的名為day的分組匹配后的信息

- -- 普通的-字符

${month} --獲得上面構(gòu)造的名為month的分組匹配后的信息

- -- 普通的-字符

${year} --獲得上面構(gòu)造的名為year的分組匹配后的信息

 

舉例來(lái)說(shuō):

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

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

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

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

了解了這個(gè)例子后,我們?cè)趤?lái)看第4個(gè)例子就很簡(jiǎn)單了。

 

第4個(gè)例子的正則

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

^ -- 表示限定匹配開(kāi)始于字符串的開(kāi)始

(?/w+) – 構(gòu)造一個(gè)名為proto的分組,匹配一個(gè)或多個(gè)字母

: -- 普通的:字符

// -- 匹配兩個(gè)/字符

[^/] – 表示這里不允許是/字符

+? – 表示指定盡可能少地使用重復(fù)但至少使用一次匹配

(?:/d+) – 構(gòu)造一個(gè)名為port的分組,匹配形如:2134(冒號(hào)+一個(gè)或多個(gè)數(shù)字)

? – 表示匹配字符出現(xiàn)0次或1次

/ -- 匹配/字符

 

最后通過(guò)${proto}${port}來(lái)獲取兩個(gè)分組構(gòu)造的匹配內(nèi)容

(有關(guān)Regex對(duì)象的用法,參考

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm) 
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 于都县| 漳浦县| 佳木斯市| 博罗县| 平和县| 陆河县| 开江县| 绥阳县| 玉山县| 万荣县| 谢通门县| 嘉祥县| 稷山县| 龙南县| 兴山县| 大洼县| 弥渡县| 榆树市| 东海县| 广丰县| 浦江县| 临沭县| 扬中市| 浑源县| 永嘉县| 疏附县| 宣汉县| 瑞安市| 阿拉尔市| 方山县| 云和县| 库尔勒市| 莆田市| 万源市| 隆尧县| 肇东市| 三台县| 长沙县| 平阴县| 峨边| 武隆县|