正則表達式-Csharp


學習筆記:正則表達式

一. 正則表達式

正則表達式(Regex)是用來進行文本處理的技術,是語言無關的,在幾乎所有語言中都有實現。

一個正則表達式就是由普通的字符及特殊字符(稱為元字符符)組成的文字模式。該模式秒殺在查找文章主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。

正則表達式的常用元字符(全為英文狀態,注意可以代表的字符種類和個數)

 

元字符

含義

.()

可以匹配除”\n”外的任意一個字符

[](中括號)

可以匹配中括號內的任意一個字符

例如,"[abc]" 匹配"plain"中的"a"

|(或符號)

可以匹配或符號兩邊的任意一個字符,優先級比較低

匹配 或 y。例如 "z|food" 可匹配 "z" 或 "food"

 

正則表達式的常用限定符(全為英文狀態)

 

元字符

含義

*(星號)

其限定的表達式出現次數等於或大於0

例如,"zo*"可以匹配"z""zoo"

+(加號)

其限定的表達式至少出現1

例如,"zo+"可以匹配"zoo",但不匹配"z"

?(問號)

其限定的表達式出現1次或0

例如,"a?ve?"可以匹配"never"中的"ve"

{n}

其限定的表達式出現次數確定n(n0)

{n,}

其限定的表達式至少出現n

{n,m}

其限定的表達式出現的次數為≥n次,≤m(m>n)

 

還有幾個重要的符號:

符號

含義

^ (Shift+6)

匹配輸入的開始位置

非的意思。例如[^a-z],匹配非a-z的一個字符。

$ (Shift+4)

匹配輸入的結尾

\

將下一個字符標記為特殊字符或字面值

例如:想匹配”.時或其他特殊字符時,需寫為的”\.

()(小括號)

1. 改變優先級

2. 分組,提取信息

 

需要熟記一些簡寫:

\d = [0-9]

\D=[^0-9]

\s =空字符,如\n tab space

\S=非空字符

\w 能組成詞的字符(字面、數字、中文或下划線等)

\W \w

 

正則表達式在.Net就是用字符串表示,這個字符串格式比較特殊,無論多么特殊,在C#語言看來都是普通的字符串,具體什么含義由Regex類內部進行語法分析。

正則表達式可以進行字符串的匹配、字符串的提取、字符串的替換。C#中分別對應正則表達式的三個重要方法。

1) IsMatch() 返回值為bool類型

格式:Regex.IsMatch("字符串", "正則表達式");

作用:判斷字符串是否符合模板要求

例如:bool b =Regex.IsMatch("bbbbg","^b.*g$");判斷字符串是否以b開頭且以g結尾,中間可以有其他字符,若正確返回true,否則else

2) Match() 返回值為Match類型,只能匹配一個

Matches() 返回值為MatchCollection集合類型,匹配所有符合的

格式:Match match = Regex.Match("字符串", "正則表達式");

MatchCollection matches= Regex. Matches ("字符串", "正則表達式");

作用:

①提取匹配的子字符串

②提取組。Groups的下標由1開始,0中存放matchvalue

例如:

Match match = Regex.Match("age=30", @"^(.+)=(.+)$");
if (match.Success){     
    Console.WriteLine(match.Groups[0] .Value);//輸出匹配的子字符串
    Console.WriteLine(match.Groups[1] .Value);//獲取第一個分組的內容
    Console.WriteLine(match.Groups[2] .Value);//獲取第二個分組的內容
}

----------------------------------------------------------------------------------

View Code
        MatchCollection matches = Regex.Matches("2010年10月10日", @"\d+");
         for (int i = 0; i < matches.Count; i++)
         {
                Console.WriteLine(matches[i].Value);
         }

3) Replace() 返回值為string

兩種常用方式如下:

View Code
            //將所有的空格替換為單個空格
            string str = "   aa afds     fds  f ";
            str = Regex.Replace(str, @"\s+", " ");
            Console.WriteLine(str);

            string str = "hello“welcome to ”beautiful “China”";
            //hello"welcome to "beautiful "China"
            //$1表示引用第一組。$2表示用第二組。
            string strresult = Regex.Replace(str, "“(.+?)”", "\"$1\"");
            Console.WriteLine(strresult);    

貪婪模式與終結貪婪模式

 

實際應用有采集器(從某個網頁上采集郵箱、圖片或其他信息)、敏感詞過濾、UBB翻譯器。

采集郵箱:

 

保存圖片:

 

網址處理:

 

敏感詞過濾:

 

UBB翻譯:

 

 

一些常用的正則表達式

正則表達式用於字符串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。我將一些常用的表達式收藏在這里,作備忘之用。本貼隨時會更新。 

匹配中文字符的正則表達式: [\u4e00-\u9fa5] 

匹配雙字節字符(包括漢字在內)[^\x00-\xff] 

匹配空行的正則表達式:\n[\s| ]* 

匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/ 

匹配首尾空格的正則表達式:(^\s*)|(\s*$) 

匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 


補充: 
^\d+$  //匹配非負整數(正整數 + 0) 
^[0-9]*[1-9][0-9]*$  //匹配正整數 
^((-\d+)|(0+))$  //匹配非正整數(負整數 + 0) 
^-[0-9]*[1-9][0-9]*$  //匹配負整數 
^-?\d+$    //匹配整數 
^\d+(\.\d+)?$  //匹配非負浮點數(正浮點數 + 0) 
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮點數 
^((-\d+(\.\d+)?)|(0+(\.0+)?))$  //匹配非正浮點數(負浮點數 + 0) 
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匹配負浮點數 
^(-?\d+)(\.\d+)?$  //匹配浮點數 
^[A-Za-z]+$  //匹配由26個英文字母組成的字符串 
^[A-Z]+$  //匹配由26個英文字母的大寫組成的字符串 
^[a-z]+$  //匹配由26個英文字母的小寫組成的字符串 
^[A-Za-z0-9]+$  //匹配由數字和26個英文字母組成的字符串 
^\w+$  //匹配由數字、26個英文字母或者下划線組成的字符串 
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //匹配email地址 
^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //匹配url

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM