自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解C#正則表達(dá)式

開發(fā) 后端
本文介紹C#正則表達(dá)式,單的C#正則表達(dá)式對(duì)于一些高級(jí)運(yùn)用,功能遠(yuǎn)遠(yuǎn)不夠。若要進(jìn)行篩選的結(jié)構(gòu)比較復(fù)雜,你可能就需要用到高級(jí)C#正則表達(dá)式。

C#正則表達(dá)式(Regular Expression, abbr. regex) 功能強(qiáng)大,能夠用于在一大串字符里找到所需信息。它利用約定俗成的字符結(jié)構(gòu)表達(dá)式來發(fā)生作用。不幸的是,簡(jiǎn)單的C#正則表達(dá)式對(duì)于一些高級(jí)運(yùn)用,功能遠(yuǎn)遠(yuǎn)不夠。若要進(jìn)行篩選的結(jié)構(gòu)比較復(fù)雜,你可能就需要用到高級(jí)C#正則表達(dá)式。

本文為您介紹C#正則表達(dá)式的高級(jí)技巧。如果你對(duì)正則的基本概念尚缺乏了解,請(qǐng)先閱讀 這篇文章,或者 這個(gè)教程,或者維基條目。

這里的正則語(yǔ)法適用于PHP,與Perl兼容。

1. 貪婪/懶惰

所有能多次限定的正則運(yùn)算符都是貪婪的。他們盡可能多地匹配目標(biāo)字符串,也就是說匹配結(jié)果會(huì)盡可能地長(zhǎng)。不幸的是,這種做法并不總是我們想要的。因此,我們添加“懶惰”限定符來解決問題。在各個(gè)貪婪運(yùn)算符后添加“?”能讓表達(dá)式只匹配盡可能短的長(zhǎng)度。另外,修改器“U”也能惰化能多次限定的運(yùn)算符。理解貪婪與懶惰的區(qū)別是運(yùn)用高級(jí)C#正則表達(dá)式的基礎(chǔ)。

貪婪操作符
操作符 * 匹配之前的表達(dá)式零次或零次以上。它是一個(gè)貪婪操作符。請(qǐng)看下面的例子:

preg_match( '/< h1>.*< \/h1>/', '< h1>這是一個(gè)標(biāo)題。< /h1>
< h1>這是另一個(gè)。< /h1>', $matches );

句點(diǎn)(.)能代表除換行符外的任意字符。上面的C#正則表達(dá)式匹配 h1 標(biāo)簽以及標(biāo)簽內(nèi)的所有內(nèi)容。它用句點(diǎn)(.)和星號(hào)(*)來匹配標(biāo)簽內(nèi)的所有內(nèi)容。匹配結(jié)果如下:

< h1>這是一個(gè)標(biāo)題。< /h1>< h1>這是另一個(gè)。< /h1>

整個(gè)字串都被返回。* 操作符會(huì)連續(xù)匹配所有內(nèi)容—— 甚至包括中間的 h1 閉合標(biāo)簽。因?yàn)樗秦澙返模ヅ湔麄€(gè)字串是符合其利益最大化原則。

懶惰操作符
把上面的式子稍作修改,加上一個(gè)問號(hào)(?),能讓表達(dá)式變懶惰:

/< h1>.*?< \/h1>/
 
這樣它會(huì)覺得,只需匹配到第一個(gè) h1 結(jié)尾標(biāo)簽就完成任務(wù)了。

另一個(gè)有著類似屬性的貪婪操作符是 {n,} 。它代表之前的匹配模式重復(fù)n次或n次以上,如果沒有加上問號(hào),它會(huì)尋找盡可能多的重復(fù)次數(shù),加上的話,則會(huì)盡可能少重復(fù)(當(dāng)然也就是“重復(fù)n次”最少)。

◆建立字串
$str = 'hihihi oops hi';
◆使用貪婪的{n,}操作符進(jìn)行匹配
preg_match( '/(hi){2,}/', $str, $matches ); 
◆matches[0] 將是 'hihihi'
◆使用墮化了的 {n,}? 操作符匹配
preg_match( '/(hi){2,}?/', $str, $matches ); 
◆matches[0] 將是 'hihi'

2. 回返引用(Back referencing)

有什么用?
回返引用(Back referencing)一般被翻譯成“反向引用”、“后向引用”、“向后引用”,個(gè)人覺得“回返引用”更為貼切[笨活兒]。它是在C#正則表達(dá)式內(nèi)部引用之前捕獲到的內(nèi)容的方法。例如,下面這個(gè)簡(jiǎn)單例子的目的是匹配出引號(hào)內(nèi)部的內(nèi)容:

◆建立匹配數(shù)組
$matches = array();
◆建立字串
$str = ""This is a 'string'"";
◆用C#正則表達(dá)式捕捉內(nèi)容
preg_match( "/(\"|').*?(\"|')/", $str, $matches );
◆輸出整個(gè)匹配字串
echo  $matches[0];
 
它會(huì)輸出:

"This is a'

顯然,這并不是我們想要的內(nèi)容。

這個(gè)表達(dá)式從開頭的雙引號(hào)開始匹配,遭遇單引號(hào)之后就錯(cuò)誤地結(jié)束了匹配。這是因?yàn)楸磉_(dá)式里說:("|'),也就是雙引號(hào)(")和單引號(hào)(')均可。要修正這個(gè)問題,你可以用到回返引用。表達(dá)式\1,\2,…,\9 是對(duì)前面已捕獲到的各個(gè)子內(nèi)容的編組序號(hào),能作為對(duì)這些編組的“指針”而被引用。在此例中,第一個(gè)被匹配的引號(hào)就由\1代表。

如何運(yùn)用?
將上面的例子中,后面的閉合引號(hào)替換為1:

preg_match( '/(\"|').*?\1/', $str, $matches );

這會(huì)正確地返回字串:

"This is a 'string'"

譯注思考題:

如果是中文引號(hào),前引號(hào)和后引號(hào)不是同一個(gè)字符,怎么辦?

還記得PHP函數(shù) preg_replace 嗎?其中也有回返引用。只不過我們沒有用 \1 … \9,而是用了 $1 … $9 … $n (此處任意數(shù)目均可)作為回返指針。例如,如果你想把所有的段落標(biāo)簽< p>都替換成文本:

$text = preg_replace( '/< p>(.*?)< /p>/',
"&lt;p&gt;$1&lt;/p&gt;", $html );

參數(shù)$1是一個(gè)回返引用,代表段落標(biāo)簽< p>內(nèi)部的文字,并插入到替換后的文本里。這種簡(jiǎn)便易用的表達(dá)式寫法為我們提供了一個(gè)獲取已匹配文字的簡(jiǎn)單方法,甚至在替換文本時(shí)也能使用。

3. 已命名捕獲組(Named Groups)

當(dāng)在一個(gè)表達(dá)式內(nèi)多次用到回調(diào)引用時(shí),很容易就把事情搞混淆,要弄清那些數(shù)字(1 … 9)都代表哪一個(gè)子內(nèi)容是件很麻煩的事?;卣{(diào)引用的一個(gè)替代方法是使用帶名字的捕獲組(下文簡(jiǎn)稱“有名組”)。有名組使用 (?P< name>pattern)來設(shè)定,name代表組名,pattern是配合該有名組的正則結(jié)構(gòu)。請(qǐng)看下面的例子:

/(?P< quote>"|').*?(?P=quote)/

上式中,quote就是組名,"|'是改組匹配內(nèi)容的正則。后面的(?P=quote)是在調(diào)用組名為quote的有名組。這個(gè)式子的效果和上面的回調(diào)引用實(shí)例一樣,只不過是用了有名組來實(shí)現(xiàn)。是不是更加易讀易懂了?

有名組也能用于處理已匹配內(nèi)容之?dāng)?shù)組的內(nèi)部數(shù)據(jù)。賦予特定正則的組名也能作為所匹配到的內(nèi)容在數(shù)組內(nèi)部的索引詞。

preg_match( '/(?P< quote>"|\')/', "'String'", $matches );
◆下面的語(yǔ)句輸出“'”(不包括雙引號(hào))
echo $matches[1];
◆使用組名調(diào)用,也會(huì)輸出“'”
echo $matches['quote'];

所以,有名組并不只是讓寫代碼更容易,它也能用于組織代碼,以上介紹C#正則表達(dá)式。

【編輯推薦】

  1. C#調(diào)用Windows API函數(shù)
  2. 詳解C#調(diào)用Outlook API
  3. C#連接Access、SQL Server數(shù)據(jù)庫(kù)
  4. 介紹C#調(diào)用API的問題
  5. C#調(diào)用Excel與附加代碼
責(zé)任編輯:佚名 來源: IT專家網(wǎng)
相關(guān)推薦

2009-08-17 13:56:28

C#正則表達(dá)式入門

2009-08-20 16:23:32

C#正則表達(dá)式語(yǔ)法

2009-08-07 15:16:10

C#正則表達(dá)式

2009-08-11 13:00:41

C#正則表達(dá)式

2009-08-13 15:24:27

C#正則表達(dá)式

2024-12-16 07:33:45

C#正則表達(dá)式

2009-08-14 16:50:59

C#正則表達(dá)式語(yǔ)法

2021-03-02 07:33:13

開發(fā)C#字符

2009-08-13 15:02:52

C#正則表達(dá)式引擎貪婪

2009-08-14 15:50:45

C#正則表達(dá)式

2009-08-20 15:10:33

C#正則表達(dá)式

2009-08-14 17:52:30

C#表達(dá)式工具

2009-08-20 15:06:51

C#正則表達(dá)式

2009-08-20 15:02:41

C#正則表達(dá)式

2009-08-20 14:57:00

C#正則表達(dá)式

2011-07-06 11:04:42

C#正則表達(dá)式

2009-09-16 18:19:34

正則表達(dá)式組

2009-08-27 15:45:30

C#正則表達(dá)式

2009-08-24 17:14:41

正則表達(dá)式C#和.NET框架

2011-04-25 08:44:34

C#正則表達(dá)式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)