常見的正則表達式解讀釋義


又名:寫給正在學習前端的女友看的常見正則表達式解讀。原文發布於 https://www.zybuluo.com/wddpct/note/728081

1. 歸納定義

對給定的字符集:Σ={c1,c2,c3,……,cn}

  • 空串ε是一個正則表達式
  • 對於任何的c∈Σ,c是正則表達式
  • 如果M和N都是正則表達式,則以下也是正則表達式
    • 選擇 M|N = {M,N}
    • 連接 MN = {mn,m∈M,n∈N}

2. 保留字符

這節中的表格內容來自 正則表達式30分鍾入門教程,對此表示感謝。

2.1 常用的元字符

代碼 說明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下划線
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束

2.2 常用的限定符

代碼/語法 說明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次

2.3 常用的反義詞

代碼/語法 說明
\W 匹配任意不是字母,數字,下划線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符

2.4 懶惰限定符

代碼/語法 說明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復

2.5 常用分組語法

代碼/語法 說明
(exp) 匹配exp,並捕獲文本到自動命名的組里
(?< name >exp) 匹配exp,並捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?< !exp) 匹配前面不是exp的位置
(?#comment) 這種類型的分組不對正則表達式的處理產生任何影響,用於提供注釋讓人閱讀

3. 常用正則表達式

1. 匹配中文字符

正則表達式:[\u4e00-\u9fa5]

說明:目前主流計算機底層的編碼系統都是Unicode,而在Unicode標准中,漢字表的第一個編碼為U+4e00,最后一個編碼為U+9fa5,所以[\u4e00-\u9fa5]就代表匹配任意一個Unicode編碼表中存在的漢字。

2.匹配雙字節字符

正則表達式:[^\x00-\xff]

說明:\x代表十六進制形式,2個字節長度的十六進制最大范圍為00-ff,所以[^\x00-\xff]表示匹配長度為雙字節的字符。

3. 匹配空白行

正則表達式:\n\s*\r

說明:這個表達式表示匹配內容中的空白行,比如一個txt由多行文字組成,並且句子與句子之間存在空白行,這個正則表達式便能加以區分。

首先,\n表示匹配一個換行符,而\s*代表匹配任意的空白符,\r表示匹配任意的回車符。

示例如下。

public class Program
    {
        static void Main(string[] args)
        {
            string[] sentences =
            {
                @"C# code

",
                @"Chapter 2: 

Writing Code",
                @"Unicode",
                @"match

here"
            };

            string sPattern = @"\n\s*\r";
            foreach (string s in sentences)
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
                {
                    System.Console.WriteLine("  (match for '{0}' found)", s);
                }
                else
                {
                    System.Console.WriteLine();
                }
            }
        }
    }

4. 匹配Email地址

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

此處輸入圖片的描述

示例:wddpct@gmail.com,wdd.pct@gmail.com,wddpct-pct@gmail.com

5. 匹配URL

正則表達式:[a-zA-Z]+:\/\/[^\s]*

說明:[a-zA-Z]+表示匹配任意長度字符串,並且字符串包含的字符只能是a和z或者A和Z之間的字母。‘:\/\/’表示匹配“😕/”字符串。[^\s]*表示匹配任意長度的不包含非空字符的字符串。

當然了,日常生活中見到的網址URL大多以http或https開頭,所以匹配以http或者https開發的網址也十分簡單,筆者隨手寫了兩個以供參考,比如 (http|https)://[^\s]*或者http[s]?://[^\s]*

6. 匹配國內電話號碼

正則表達式:\d{3}-\d{8}|\d{4}-\d{7,8}

說明:‘|’將匹配條件分為兩部分。\d{3}-\d{8}代表匹配xxx-xxxxxxxx數字形式的號碼。右邊的\d{4}-\d{7,8}代表匹配xxxx-xxxxxxx或者xxxx-xxxxxxxx數字形式的號碼。

示例:0577-12345678

7. 匹配騰訊qq號

正則表達式:[1-9][0-9]{4,}

說明:這個正則EXP十分容易理解,[1-9]表示匹配QQ號首位不為零的任意數字,[0-9]{4,}表示匹配從第二位開始最小長度為4的任意數字的字符串。

示例:1242450501

8. 匹配中國郵政編碼

正則表達式:[1-9]\d{5}(?!\d)

說明:[1-9]表示匹配不為零的任意數字,(?!)表示零寬斷言的一種語法,又稱零寬度負預測先行斷言,表示位置的后面不能匹配表達式,所以\d{5}(?!\d)表示匹配5位數字,而且這5位數字的后面不能是數字。

示例:325800,325800編碼

9. 匹配18位身份證

正則表達式:^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$

說明:這段正則雖然很長,其實表達的意思也非常簡單。\d{6}代表匹配6位數字,\d{4}代表匹配4位數字,\d{2}代表匹配2位數字,\d{3}代表匹配3位數字,最后的[0-9]|X代表匹配0到9的任意數字,或者匹配X字母,正巧,筆者的身份證最后一位就是X。

示例: 65900719951006773X

10. 匹配正整數

正則表達式:^[1-9]\d*$

說明:[1-9]表示首位匹配1到9的任意數字,\d*代表從第二位開始可以為空,不為空時必須為數字。由此正則推廣開來,匹配負整數的表達式格式應該為 ^-[1-9]\d*$

11. 匹配整數

正則表達式:^-?[1-9]\d*$

說明:后面的[1-9]\d*和匹配正整數的表達式一致,所以只要看懂-?代表整數的符號位可以有‘-’即可。

12. 匹配非負整數

正則表達式:^[1-9]\d*|0$

說明:[1-9]\d*和匹配正整數的表達式一致,|0表示可為0。同理,表示非正整數的表達式應該是 ^-[1-9]\d*|0$

13. 匹配正浮點數

正則表達式:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

說明:[1-9]\d*\.\d*代表匹配格式形如“正整數.數字”的字符串,0\.\d*[1-9]\d*$ 代表匹配格式形如“0.數字”的字符串。中間用|代表或條件。所以同理,匹配負浮點數的正則為^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$


免責聲明!

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



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