正則表達式
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
元字符
由於 \ 和 " 或者 ’ 組合無法顯示出來,所以下面的內容儘可能的加了一個空格。
字符 | 描述 |
---|---|
\ | 將下一個字符標記爲一個特殊字符、或一個原義字符、或一個 向後引用、或一個八進制轉義符。例如,‘n’ 匹配字符 “n”。’\n’ 匹配一個換行符。序列 ’ \ \ ’ 匹配 " \ " 而 “\ (” 則匹配 " ("。 |
^ | 匹配輸入字符串的開始位置。 |
$ | 匹配輸入字符串的結束位置。 |
* | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價於{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價於 {1,}。 |
{n,m} | m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 將匹配 “fooooood” 中的前三個 o。請注意在逗號和兩個數之間不能有空格。 |
. | 匹配除換行符(\n、\r)之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用像"(.I\n)"的模式。 |
(pattern) | 匹配 pattern 並獲取這一匹配 。 |
[xyz] | 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[a-z] | 字符範圍。匹配指定範圍內的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字符。 |
\w | 匹配字母、數字、下劃線。等價於’[A-Za-z0-9_]’。 |
當然不止上面那麼少的元字符,只列出來用到的,還有很多元字符,包括普通字符、非打印字符、特殊字符、限定符、定位符等。如果想要了解更多關於這方面的知識,可以點這裏。正則表達式 - 教程
電子郵箱格式驗證
在網絡中,電子郵箱可以自動接收網絡任何電子郵箱所發的電子郵件,並能存儲規定大小的等多種格式的電子文件。電子郵箱具有單獨的網絡域名,其電子郵局地址在@後標註,電子郵箱一般格式爲:用戶名@域名。
—個完整的Internet郵件地址由以下兩個部分組成,格式如下:登錄名@主機名.域名
中間用—個表示“在”(at)的符號“@”分開,符號的左邊是對方的登錄名,右邊是完整的主機名,它由主機名與域名組成。其中,域名由幾部分組成,每一部分稱爲一個子域(Subdomain),各子域之間用圓點“.”隔開,每個子域都會告訴用戶一些有關這臺郵件服務器的信息。
從上面的描述就可以看出來,電子郵箱的格式範圍很廣,唯一比較明顯的限制可能就是隻有一個"@"符號,但是這並不代表我們能胡來,根據國內一些企業郵箱對於註冊郵箱賬號的限制,列了幾條比較通用的電子郵箱格式限制:
“@”的左邊限制:
- 由a~z的英文字母(不區分大小寫)開頭
- 可由英文字母、0~9的數字、點、減號或下劃線組成
- 長度爲3~18個字符
- 不能以點、減號結尾
“@”的左邊限制 | 正則表達式 |
---|---|
英文字母、0~9的數字、下劃線 | \w+ |
減號、點 | [-.] |
長度爲3~18個字符 | {3,18} |
不能以點、減號或下劃線結尾 | [-.][A-Za-z0-9]+ |
將上面的正則表達式按照一定的邏輯連接起來:
(\w+([-.][A-Za-z0-9]+)*){3,18}
至於用到了 ( )*,代表這裏面的字符串可能會出現,也可能不出現。而 + 代表一定出現一次。
“@”的右邊限制:
- 只能有一個點,點和"@"之間不能爲空
- 可由英文字母、0~9的數字、點、減號或下劃線組成
- 不能以點、減號或下劃線結尾
“@”的右邊限制 | 正則表達式 |
---|---|
英文字母、0~9的數字、下劃線 | \w+ |
只能有一個點,點和"@"之間不能爲空 | @\w+([-.][A-Za-z0-9]+)* \. |
減號、點 | [-.] |
不能以點、減號或下劃線結尾 | [-.][A-Za-z0-9]+ |
將上面的正則表達式按照一定的邏輯連接起來:
@\w+([-.][A-Za-z0-9]+)*\.\w+([-.][A-Za-z0-9]+)*
So,將這兩段正則表達式連起來就是驗證電子郵箱的正則表達式了:
^(\w+([-.][A-Za-z0-9]+)*){3,18}@\w+([-.][A-Za-z0-9]+)*\.\w+([-.][A-Za-z0-9]+)*$
以"^“開始,以”$"結束。
JAVA代碼實現:
public static boolean isValidEmail(String email) {
if ((email != null) && (!email.isEmpty())) {
return Pattern.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$", email);
}
return false;
}
測試結果截圖:
如果覺得上面的正則表達式太複雜,範圍太廣了,可以用下面這個:
[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+
只能是0-9數字和大小寫字母組成,-和多餘的點都不行,但是這個可用於大部分場景!