最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#正則表達(dá)式的遞歸匹配分析

 更新時間:2014年09月05日 09:14:51   投稿:shichen2014  
這篇文章主要介紹了C#正則表達(dá)式的遞歸匹配分析,針對C#程序的正則匹配方法,很有實用價值,需要的朋友可以參考下

在C#程序設(shè)計中經(jīng)常會遇到這樣的需求,要求匹配出成對的小括號里的內(nèi)容,但是一般正則表達(dá)式中的 ?R 的語法似乎在C#中不被支持, 經(jīng)過一番查找與測試,終于找到以下一段描述

/(  應(yīng)該是 \( 不是用 /轉(zhuǎn)義而是用 \來轉(zhuǎn)義

匹配嵌套的構(gòu)造

微軟公司已經(jīng)包含了一個有趣的創(chuàng)新來匹配穩(wěn)定的構(gòu)造(歷史上,這是正則表達(dá)式所做不到的)。這并不容易掌握 — 盡管這節(jié)較短,但是注意,它非常的晦澀難懂。
從一個例子開始可能更簡單一些,所以我用這段代碼作為開始:

Regex r = new Regex(@"/((?>[^()]+|/((?<DEPTH>)|/)(?<-DEPTH>))*(?(DEPTH)(?!))/)"); 

這能匹配到首個完全配對的括號組,比如"before (nope (yes (here) okay) after"里面的"(yes (here) okay)"。注意第一個左括號沒有被匹配到,因為沒有和它匹配的右括號。

下面是它如何運(yùn)作的概覽:

1、在每個"("被匹配到的時候,"(?<DEPTH>)"在這里加上一,告訴正則表達(dá)式系統(tǒng)當(dāng)前括號嵌套的深度( 正則表達(dá)式開頭的"/("不包括在這里)。

2、在每個")"被匹配到的時候,"(?<-DEPTH>)"從深度值內(nèi)減一。

3、"(?(DEPTH)(?!))"保證在匹配最后一個右括號之前深度為零。

它能工作的原因在于引擎的回逆堆棧保存了匹配成功的組的軌跡。"(?<DEPTH>)"不過是一個帶有名稱的分組構(gòu)造,它將總是匹配成功(不匹配任何東西)。而由于它被緊接著放在"/("之后,它的成功匹配(仍然在堆棧上直到被移除)被用于左括號的計數(shù)。

譯注:還有一種寫法是"(?<DEPTH>/()",我個人比較喜歡這種形式,而不是"/((?<DEPTH>)"。后面的"/)(?<-DEPTH>)"也是一樣。

這樣,匹配成功了的名為"DEPTH"的分組的計數(shù)在回逆堆棧上被建立起來。而當(dāng)找到右括號的時候我們還希望從深度值減一,這是由.NET特別的語法構(gòu)造"(?<-DEPTH>)"實現(xiàn)的,它將從堆棧上移除最近匹配的"DEPTH"分組。如果堆棧上已經(jīng)沒有記錄,"(?<-DEPTH>)"分組匹配失敗,從而防止了正則表達(dá)式系統(tǒng)匹配多余的右括號。

最后,"(?(DEPTH)(?!))"是一個用于"(?!)"的斷言,如果"DEPTH"分組到目前為止還是成功的話。如果當(dāng)我們匹配到這里時還是成功的,這里有個未配對的左括號還沒有被"(?<-DEPTH>)"移除。在這種情況,我們希望停止匹配(我們不希望匹配一個未配對的括號),所以我們使用"(?!)",它是一個“零寬度負(fù)預(yù)測先行斷言”,僅當(dāng)子表達(dá)式不在此位置的右側(cè)匹配時才繼續(xù)匹配。
這就是在.NET的正則表達(dá)式實現(xiàn)中匹配嵌套結(jié)構(gòu)的方法。

以上內(nèi)容似乎很難懂, 其實如果覺的難懂的話也簡單,那你就不要去理解,你只要能用就OK了,把() 替換成你要的字符,相信可以解決不少你的問題,

以下根據(jù)這個用法寫了個測試用例

private void button3_Click( object sender, EventArgs e )
{
    Regex r = new Regex( @"/[(?>[^/[/]]+|/[(?<DEPTH>)|/](?<-DEPTH>))*(?(DEPTH)(?!))/]" );
    StringBuilder sb = new StringBuilder();
    MatchString( "[111[222[333]]][222[333]][333]", r, sb );
    MessageBox.Show( sb.ToString(), "取到的信息" );
}
private void MatchString( string OutString, Regex r, StringBuilder sb )
{
    MatchCollection ms = r.Matches( OutString );// 獲取所有的匹配
    foreach ( Match m in ms )
    {
          if ( m.Success )
          {
               sb.AppendLine( m.Groups[0].Value );
               MatchString( m.Groups[0].Value.Substring( 1, m.Groups[0].Value.Length - 1 ), r, sb );// 去掉匹配到的頭和尾的 "[" 和 "]",避免陷入死循環(huán)遞歸中,導(dǎo)致溢出
           }
     }
     return;
}

可以得到

[111[222[333]]] [222[333]] [333] [222[333]] [333] [333] 

相信本文所述對大家的C#程序設(shè)計有一定的借鑒價值。

相關(guān)文章

  • C# wpf Grid中實現(xiàn)控件拖動調(diào)整大小的示例代碼

    C# wpf Grid中實現(xiàn)控件拖動調(diào)整大小的示例代碼

    本文主要介紹了C# wpf Grid中實現(xiàn)控件拖動調(diào)整大小的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析

    C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析

    這篇文章主要介紹了C#實現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實例解析,包括websocket sharp組件的概念及使用方法,需要的朋友可以參考下
    2017-04-04
  • Unity游戲開發(fā)之炸彈人游戲的實現(xiàn)

    Unity游戲開發(fā)之炸彈人游戲的實現(xiàn)

    大家小時候肯定玩過這款游戲,炸彈人也算是經(jīng)典中的經(jīng)典啦。本文將利用Unity模擬實現(xiàn)這一經(jīng)典游戲,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-03-03
  • C#實現(xiàn)圖形位置組合轉(zhuǎn)換的方法

    C#實現(xiàn)圖形位置組合轉(zhuǎn)換的方法

    這篇文章主要介紹了C#實現(xiàn)圖形位置組合轉(zhuǎn)換的方法,涉及C#使用Matrix操作圖形的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C#加鎖防止并發(fā)的幾種方法詳解

    C#加鎖防止并發(fā)的幾種方法詳解

    文章介紹了C#中多種加鎖方式,包括lock、Monitor、SemaphoreSlim、Mutex、ReaderWriterLockSlim、Concurrent集合、Redis分布式鎖,以及在實際工作中的應(yīng)用和注意事項,感興趣的朋友一起看看吧
    2025-03-03
  • C#控制圖像旋轉(zhuǎn)和翻轉(zhuǎn)的方法

    C#控制圖像旋轉(zhuǎn)和翻轉(zhuǎn)的方法

    這篇文章主要介紹了C#控制圖像旋轉(zhuǎn)和翻轉(zhuǎn)的方法,涉及C#圖像操作中RotateFlip方法的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#網(wǎng)絡(luò)爬蟲代碼分享 C#簡單的爬取工具

    C#網(wǎng)絡(luò)爬蟲代碼分享 C#簡單的爬取工具

    這篇文章主要為大家詳細(xì)介紹了C#網(wǎng)絡(luò)爬蟲代碼,教大家如何制作了簡單的爬取工具,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Asp.Net中避免重復(fù)提交和彈出提示框的實例代碼

    Asp.Net中避免重復(fù)提交和彈出提示框的實例代碼

    本文分為前臺和后臺代碼實現(xiàn)避免重復(fù)提交和彈出提示框效果,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-02-02
  • C#泛型詳解及關(guān)鍵字作用

    C#泛型詳解及關(guān)鍵字作用

    這篇文章主要來講講c#中的泛型,因為泛型在c#中有很重要的位置,對于寫出高可讀性,高性能的代碼有著關(guān)鍵的作用,大家都知道泛型公共語言運(yùn)行庫是非常重要功能,那么為什么使用泛型呢,帶著這個問題一起通過本文學(xué)習(xí)下吧
    2021-08-08
  • 通過C#實現(xiàn)在Word中插入或刪除分節(jié)符

    通過C#實現(xiàn)在Word中插入或刪除分節(jié)符

    在Word中,分節(jié)符是一種強(qiáng)大的工具,用于將文檔分成不同的部分,每個部分可以有獨(dú)立的頁面設(shè)置,如頁邊距、紙張方向、頁眉和頁腳等,本文將介紹如何使用一個免費(fèi)的.NET庫通過C#實現(xiàn)插入或刪除Word分節(jié)符,需要的朋友可以參考下
    2024-08-08

最新評論

保亭| 德钦县| 白水县| 海阳市| 万宁市| 儋州市| 宝兴县| 潼关县| 新乡县| 平阳县| 韶山市| 东丰县| 洪雅县| 洮南市| 册亨县| 镇坪县| 潮州市| 吴忠市| 松溪县| 略阳县| 定州市| 会昌县| 砚山县| 启东市| 安阳县| 高雄市| 通化市| 阿拉善左旗| 西昌市| 当雄县| 嘉黎县| 崇礼县| 贵德县| 洪洞县| 竹北市| 合作市| 淮南市| 彭阳县| 阆中市| 青田县| 五常市|