又名:寫給正在學習前端的女友看的常見正則表達式解讀。原文發布於 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*$
。