成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解C#正則表達式

開發 后端
本文介紹C#正則表達式,單的C#正則表達式對于一些高級運用,功能遠遠不夠。若要進行篩選的結構比較復雜,你可能就需要用到高級C#正則表達式。

C#正則表達式(Regular Expression, abbr. regex) 功能強大,能夠用于在一大串字符里找到所需信息。它利用約定俗成的字符結構表達式來發生作用。不幸的是,簡單的C#正則表達式對于一些高級運用,功能遠遠不夠。若要進行篩選的結構比較復雜,你可能就需要用到高級C#正則表達式。

本文為您介紹C#正則表達式的高級技巧。如果你對正則的基本概念尚缺乏了解,請先閱讀 這篇文章,或者 這個教程,或者維基條目。

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

1. 貪婪/懶惰

所有能多次限定的正則運算符都是貪婪的。他們盡可能多地匹配目標字符串,也就是說匹配結果會盡可能地長。不幸的是,這種做法并不總是我們想要的。因此,我們添加“懶惰”限定符來解決問題。在各個貪婪運算符后添加“?”能讓表達式只匹配盡可能短的長度。另外,修改器“U”也能惰化能多次限定的運算符。理解貪婪與懶惰的區別是運用高級C#正則表達式的基礎。

貪婪操作符
操作符 * 匹配之前的表達式零次或零次以上。它是一個貪婪操作符。請看下面的例子:

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

句點(.)能代表除換行符外的任意字符。上面的C#正則表達式匹配 h1 標簽以及標簽內的所有內容。它用句點(.)和星號(*)來匹配標簽內的所有內容。匹配結果如下:

< h1>這是一個標題。< /h1>< h1>這是另一個。< /h1>

整個字串都被返回。* 操作符會連續匹配所有內容—— 甚至包括中間的 h1 閉合標簽。因為它是貪婪的,匹配整個字串是符合其利益最大化原則。

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

/< h1>.*?< \/h1>/
 
這樣它會覺得,只需匹配到第一個 h1 結尾標簽就完成任務了。

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

◆建立字串
$str = 'hihihi oops hi';
◆使用貪婪的{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)一般被翻譯成“反向引用”、“后向引用”、“向后引用”,個人覺得“回返引用”更為貼切[笨活兒]。它是在C#正則表達式內部引用之前捕獲到的內容的方法。例如,下面這個簡單例子的目的是匹配出引號內部的內容:

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

"This is a'

顯然,這并不是我們想要的內容。

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

如何運用?
將上面的例子中,后面的閉合引號替換為1:

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

這會正確地返回字串:

"This is a 'string'"

譯注思考題:

如果是中文引號,前引號和后引號不是同一個字符,怎么辦?

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

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

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

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

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

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

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

有名組也能用于處理已匹配內容之數組的內部數據。賦予特定正則的組名也能作為所匹配到的內容在數組內部的索引詞。

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

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

【編輯推薦】

  1. C#調用Windows API函數
  2. 詳解C#調用Outlook API
  3. C#連接Access、SQL Server數據庫
  4. 介紹C#調用API的問題
  5. C#調用Excel與附加代碼
責任編輯:佚名 來源: IT專家網
相關推薦

2009-08-20 16:23:32

C#正則表達式語法

2009-08-17 13:56:28

C#正則表達式入門

2009-08-07 15:16:10

C#正則表達式

2009-08-11 13:00:41

C#正則表達式

2009-08-13 15:24:27

C#正則表達式

2024-12-16 07:33:45

C#正則表達式

2009-08-14 16:50:59

C#正則表達式語法

2009-09-16 18:19:34

正則表達式組

2009-08-13 15:02:52

C#正則表達式引擎貪婪

2009-08-14 15:50:45

C#正則表達式

2009-08-14 17:52:30

C#表達式工具

2021-03-02 07:33:13

開發C#字符

2009-08-20 15:10:33

C#正則表達式

2009-08-20 15:02:41

C#正則表達式

2009-08-20 15:06:51

C#正則表達式

2009-08-20 14:57:00

C#正則表達式

2009-08-24 17:14:41

正則表達式C#和.NET框架

2009-08-27 15:45:30

C#正則表達式

2009-08-20 14:43:03

C#正則表達式Rege

2011-04-25 08:44:34

C#正則表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄色录像毛片 | 一区二区三区高清不卡 | 四虎永久免费在线 | 欧美国产视频 | 喷水毛片 | 91在线精品秘密一区二区 | 四虎永久影院 | 日韩精品一区二区三区 | 一级做受毛片免费大片 | 手机av在线 | 日韩成人在线网站 | 亚洲播放一区 | 91av视频在线免费观看 | 日韩欧美一区二区在线播放 | 成人在线视 | 亚洲国产免费 | 91在线视频播放 | 日韩在线不卡视频 | 中文字幕亚洲一区二区va在线 | 日韩一 | 激情小说综合网 | 国产成人精品999在线观看 | 一二三四av | 日韩视频在线免费观看 | 久草视频在线播放 | 久久成人免费视频 | 亚洲综合二区 | 99在线免费观看 | 日本久久一区 | 亚洲成人高清 | 欧美一级片免费看 | 欧美午夜视频 | www.亚洲一区二区 | 日韩成人av在线 | 成人一区在线观看 | 久久高清| 久视频在线观看 | 国产精品成人一区 | 中文字幕视频在线观看 | 天天射影院 | 91在线精品视频 |