Regex筆記:提取C#代碼中的中文資訊,雙引號,角括弧間的資訊

來源:互聯網
上載者:User

1.重複的表標記

* 表示前面的字元要出現0次,1次,乃至多次,上面沒有封頂, 下面保底是0次,可以不出現。

+ 表示前面的字元要出現1次,多次,上面沒有封頂,但至少要有1次。

? 表示前面的字元要出現0次,1次,上面封頂是1次,下面保底是0次,可以不出現。

 

2.其他符號

\ 表示轉義

. 表示匹配任何單個字元,好象除了斷行符號,記不清了,得查一下文檔。

^ 表示整個字串以某字元開始,如^t,整個字串這句話很重要,它只能是位於開頭。

$ 表示整個字串以某字元結束,如f$,整個字串這句話很重要,它只能是位於結尾。

[...] 表示括弧中的任一字元
| 表示選擇符號,"gray|grey"可匹配 gray 或 grey.

() 表示操作的範圍和優先度, 如 "gr(a|e)y" 可以匹配 gray 或 grey.

{n} 匹配前面字元n次, {n,} n次或無限次, {n,m} 最少n次最多m次。

\s 任一空白字元

\S 任一非空白字元

\w 任一單詞字元

\W 任一非單詞字元

\d 任一數字

\D 任一非數字

 

3.提取中文資訊的運算式。

Regex rx = new Regex("[\u4e00-\u9fa5]+");

 

4.提取雙引號之間的資訊的運算式。

Regex rx = new Regex("\"[^\"]*\"");

註解:在[]中的^意思變了,不再是以某字元開始了,而是變為不能包含後面的字元了,這叫反義。

 

5.反義

有時需要尋找不屬於某個能簡單定義的字元類的字元。比如想尋找除了數字以外,其它任一字元都行的情況,這時需要用到反義:

表3.常用的反義代碼 

代碼/文法 說明

\W 匹配任意不是字母,數字,底線,漢字的字元

\S 匹配任意不是空白符的字元

\D 匹配任意非數位字元

\B 匹配不是單詞開頭或結束的位置

[^x] 匹配除了x以外的任一字元

[^aeiou]

匹配除了aeiou這幾個字母以外的任一字元

 

6.提取雙引號之間的資訊的運算式,第二種方法。

Regex rx = new Regex("\".*?\"");

註解: 在.*之後加一個?的作用是將Regex從貪婪模式改為懶惰模式。

 

7.貪婪與懶惰

當Regex中包含能接受重複的限定符時,通常的行為是(在使整個運算式能得到匹配的前提下)匹配儘可能多的字元。考慮這個運算式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配儘可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上一個問號?。這樣.*?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)和ab(第四到第五個字元)。

為什麼第一個匹配是aab(第一到第三個字元)而不是ab(第二到第三個字元)?簡單地說,因為Regex有另一條規則,比懶惰/貪婪規則的優先順序更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。

 

8.另外,藍驛軌跡還有一種匹配雙引號的方法,就是把引號轉成16進位數,具體請參考:http://www.cnblogs.com/twh/articles/1629752.html

Regex rx = new Regex("\u0022.*?\u0022");

 

9.提取xml設定檔中包含中文的資訊,用於國際化代碼。

有可能在兩種地方出現包含中文的資訊,屬性和節點值,因此,可以用雙引號匹配一次檔案,提取出屬性值中包含的中文資訊;然後,再用角括弧匹配一次檔案,提取出節點值中包含的中文資訊,正則 rx = new Regex(">.*<"); 

如果僅僅是匹配中文,用Regex rx = new Regex("[\u4e00-\u9fa5]+")即可,但如果中文中間夾雜著標點符號或者英文,那用這個就不靈了,可以換個思路,用IsMatch來判斷資訊中是否包含中文來達到取捨的目的,樣本如下:

Regex rxChinaCharacter= new Regex("[\u4e00-\u9fa5]+")

Regex rx = new Regex(">.*<");
System.Text.RegularExpressions.MatchCollectionmatchs = rx.Matches(input);
if (matchs.Count != 0)
{
    foreach (Match m in matchs)
    {
           if (!rxChinaCharacter.IsMatch(m.Value))

           {

                 //符合包含中文的條件條件,可以留下來。

           }

   }

}

10.總結

^有兩種含義:

 1.表示整個字串以某字元開始,如^t,整個字串這句話很重要,它只能是位於開頭。

 2.放在[^t]裡表示不能包含t字元。

 

?也有兩種含義:

 1.表示前面的字元要出現0次,1次,上面封頂是1次,下面保底是0次,可以不出現。

 2.將正則從貪婪模式改為懶惰模式。

 

$ 表示整個字串以某字元結束,如f$,整個字串這句話很重要,它只能是位於結尾,如assssbtattttb這個串讓 a[^a]*b$ 來匹配,就只能匹配後半截attttb, 如用^ a[^a]*b, 就只能匹配前半段assssb, 如果用^ a[^a]*b$來匹配,則根本什麼都匹配不了。

 

推薦資料:

Regex30分鐘入門教程
http://manual.phpv.net/regular_expression.html
C#Regex整理備忘
http://www.cnblogs.com/kissknife/archive/2008/03/23/1118423.html
Regex怎麼匹配雙引號
http://www.cnblogs.com/twh/articles/1629752.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.