編寫驗證規則最流行和最簡單的方法就是正則表達式了,但惟一的一個問題是正則表達式的語法太隱晦了,讓人蛋疼無比。不少開發者爲了在項目中應用複雜的驗證,常常要使用一些小抄來記住正則式的複雜語法和各類經常使用命令。正則表達式
在這篇文章中,我將試圖讓你們明白什麼是正則表達式,以及如何更輕鬆地學習正則表達式。學習
也許你是初學者,那以防萬一,我先來說講什麼是正則表達式吧:spa
正則表達式能夠幫助咱們更好的描述複雜的文本格式。一旦你描述清楚了這些格式,那你就能夠利用它們對文本數據進行檢索、替換、提取和修改操做。code
下面有一個正則表達式的簡單例子。第一步先要引入有關正則式的命名空間:對象
1 |
using System.Text.RegularExpressions; |
第二步就是用指定的正則式構建一個正則表達式對象,下面的正則式是用來搜索長度爲10的a-z的英文字母:開發
1 |
Regex obj = new Regex( "[a-z]{10}" ); |
最後,根據正則式在指定數據中檢索匹配項,若是匹配IsMatch方法就會返回true。v8
1 |
MessageBox.Show(obj.IsMatch(「shivkoirala」).ToString()); |
記住正則語法最好的辦法就是記住這三樣東西:Bracket(括號), caret(插入符號)和Dollars(美圓符號)。字符串
B | 在正則表達式中有3種類型的括號域名 方括號 「[「和花括號「{「 。io 方括號"["內是須要匹配的字符,花括號"{"內是指定匹配字符的數量。 圓括號「(「 則是用來分組的。 |
C | 插入符號 「^」 表示正則式的開始。 |
D | 美圓符號「$」 表示正則式的結束。 |
如今你知道上面的3個語法後,你就能夠寫世界上任何一條驗證規則了。好比下面的例子就很好的說明了上面3條正則語法是如何協調運做的。
注:上圖有個錯誤,"()"應爲"{}"
好了,如今咱們就用上面的3條語法來實現一些正則表達式的驗證規則吧。
檢查用戶是否輸入了shivkoirala?
1 |
shivkoirala |
讓咱們開始第一個驗證,輸入的字符在a-g之間?
1 |
[a-g] |
輸入的字符在a-g之間而且長度爲3?
1 |
[a-g]{3} |
輸入的字符在a-g之間而且最大長度爲3最小長度爲1?
1 |
[a-g]{1,3} |
我如何在匹配像91230456, 01237648那樣的固定8位數?
1 |
^[0-9]{8}$ |
如何驗證最小長度爲3最大長度爲7的數字,如:123, 1274667, 87654?
1 |
^[0-9]{3,7}$ |
如何驗證像LJI1020那樣的發票編號,前3個是字母剩餘爲8位長度的數字?
前三個是字母:
1 |
^[a-z]{3} |
後面是8位長度的數字:
1 |
[0-9]{8} |
因此整個表達式爲:
1 |
^[a-z]{3}[0-9]{7}$ |
驗證像INV190203 或 inv820830那樣的前3位是不區分大小寫的英文字母,剩餘8位是數字。
在前面的表達式中只能匹配前3個是小寫英文字母的發票編號,若是咱們輸入大寫字母那就不能匹配了。因此爲了確保前3個字母是不區分大小寫的,咱們就要用表達式^[a-zA-Z]{3}。
1 |
^[a-zA-Z]{3}[0-9]{7}$ |
咱們能夠驗證簡單的網址URL格式嗎?
第一步:檢查是否存在www:
1 |
^www. |
第二步:域名必須是長度在1-15的英文字母:
1 |
. [a-z]{1,15} |
第三步:以.com或者.org結束:
1 |
. (com|org)$ |
完整的表達式以下:
1 |
^www[.][a-z]{1,15}[.](com|org)$ |
讓咱們在來看看BCD(其實也就是上面說的3條基本語法)如何驗證email格式。
第一步:email開始是長度在1-10的英文字母,最後跟一個"@":
1 |
^[a-zA-Z0-9]{1,10}@ |
第二步:@後面是長度在1-10的英文字母,後面跟一個".":
1 |
[a-zA-Z]{1,10}. |
第三步:最後以.com或.org結束:
1 |
.(com|org)$ |
最後完整的表達式以下:
1 |
^[a-zA-Z0-9]{1,10}@[a-zA-Z]{1,10}.(com|org)$ |
驗證值在0-25的數字:
1 |
^(([0-9])|([0-1][0-9])|([0-2][0-5]))$ |
驗證格式爲MM/DD/YYYY, YYYY/MM/DD and DD/MM/YYYY的日期:
步驟 |
正則式 |
描述說明 |
先來檢查 DD. 首先DD的長度爲1-29 ( 2月份) , 1-30 (月小) , 1-31 (月大) . 因此 DD 就是 1-9 或 01-09 |
[1-9]|0[1-9] |
容許用戶輸入1-9或者01-09. |
再爲DD添加匹配10-19 |
[1-9]|1[0-9] |
容許用戶輸入01-19. |
再爲DD添加匹配20-29 |
[1-9]|1[0-9]|2[0-9] |
容許用戶輸入01-29. |
i再爲DD添加匹配30-31 |
[1-9]|1[0-9]|2[0-9]|3[0-1] |
最後用戶能夠輸入01-31. |
再來匹配日期間的分隔符"/","-" |
[/ . -] |
容許用戶輸入日期分隔符. |
MM也是相似的操做 |
[1-9]|0[1-9]|1[0-2] |
讓用戶輸入月份值01-12. |
最後就是YY的操做 |
1[9][0-9][0-9]|2[0][0-9][0-9] |
容許用戶輸入年份1900-2099. |
最後DD/MM/YYYY格式的日期的正則表達式爲:
1 |
^([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])[- / .]([1-9]|0[1-9]|1[0-2])[- / .](1[9][0-9][0-9]|2[0][0-9][0-9])$ |
MM/DD/YYYY格式的日期:
1 |
^([1-9]|0[1-9]|1[0-2])[- / .]([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])[- / .](1[9][0-9][0-9]|2[0][0-9][0-9])$ |
YYYY/MM/DD格式的日期:
1 |
^(1[9][0-9][0-9]|2[0][0-9][0-9])[- / .]([1-9]|0[1-9]|1[0-2])[- / .]([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])$ |
你也能夠用如下的快捷命令來簡化你的正則表達式:
實際命令 | 快捷命令 |
[0-9] | d |
[a-z][0-9][_] | w |
0次或屢次發生 | * |
至少一次發生 | + |
0次或1次發生 | ? |
全文完。