正則表達式 一、正則表達式定義 JavaScript 正則表達式 正則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)使用單個字元串來描述、匹配一系列符合某個句法規則的字元串搜索模式。 搜索模式可用於文本搜索和文本替換。 簡單的說就是一個有規則的表 ...
正則表達式
一、正則表達式定義
JavaScript 正則表達式
正則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)使用單個字元串來描述、匹配一系列符合某個句法規則的字元串搜索模式。
搜索模式可用於文本搜索和文本替換。
簡單的說就是一個有規則的表達式,用於查找的通配符。
正則表達式就是一個用於查找含有匹配字元串 的 字元串
二、正則表達式對象
Js 正則表達式對象 就是 由正則表達式創建的對象,該對象可以進行匹配,提取和替換。
創建正則表達式對象
1、構造函數
var regex = new RegExp( 正則表達式字元串[, 匹配模式] );
匹配模式是可選參數:是一個可選的參數,包含屬性 g,i,m,分別使用與全局匹配,不區分大小寫匹配,多行匹配;
2、字面量 (直接量)
var regex = /正則表達式/;
三、使用正則表達式進行匹配
語法:
正則對象.test( 字元串 )
返回一個boolean值
如果參數字元串中含有 符合 正則匹配的 子字元串, 就返回 true, 否則返回 false
例如: 查詢一段文字中是否包含 yangCJ
四、基本元字元
.[^\n\r] 除了換行和回車之外的任一字元
( )表示分組和提高優先順序
[ ]表示一個字元, 出現在 [ ] 中的字元
用法: [abc]出現 [ ] 中的任意一個字元
匹配 a, 或 b, 或 c
foo[dt] 匹配 foot 或 food
|或 (優先順序是最低的,需最後考慮)
用法:正則表達式|正則表達式
選取foot 或 food
foot|food
foo(t|d)
擴展:
. 任意的一個字元. 沒有任何限制
[]是出現在[]中的一個字元. 認為 . 的限制級版本
[abc]: a 或者 b 或者 c
|可以認為是 允許使用多個字元的 匹配
a|b|c
aa|bb|cc
如果要表示 . [] () 這些符號 就要使用轉義字元
轉義字元
表示點: \.
表示[]: \[ \]
表示(): \( \)
表示\ : \\
五、限定元字元
1>
*緊跟前面的一個字元或一組字元出現 0 次到多次
次數大於等於0
表示: 123333333 後面很多 3
正則: 1233*
123 0 次
1233 1 次
12333 2 次
...
1233333333333333333
也能表示一個組的次數
1(23)*
表示:
1 (出現0次)
1 23 (出現1次)
1 23 23 (出現2次)
1 23 23 23(出現3次)
2>
+緊跟在前面的字元出現 1 次到多次
次數大於等於1
字元串: 123333333
正則: 123+
3>
?緊跟在前面的字元出現 0 次或 1 次
檢查在一段字元串中檢查是否含有 http 協議的字元串或 https 協議的字元串
https?://.+
4>
{數字}緊跟在前面的字元出現指定次數
a{3}
匹配3個a
aaa
5>
{數字,}緊跟在前面的字元至少出現指定次數
a{3,}
匹配至少3個a:
aaa, aaaaaaaaa, aaaaaaaaaaaaaa, ...
6>
{數字, 數字} 緊跟在前面的字元出現的次數範圍
a{1, 3}
匹配1到3個a
a, aa, aaa
六、首尾正則表達式
^表示必須以 xxx 開頭
^a 必須以 a 開頭的字元串
a 表示一個字元串中只要含有 a 就可以匹配
^a^a 非法的寫法, ^ 如果是表示開頭必須寫在開頭, 而且只能寫一個
$表示 必須以 xxx 結尾
a$必須以 a 結尾
分析^a+$
匹配一個只有a 的字元串
七、案例
1> 寫一個正則表達式匹配 身份證號碼
身份證是 18 位數字
省 市 區 出生年月 隨機編碼X
1) 首先是要做匹配, 就一定要使用 ^ $
2) 是 18 位數字( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ). 可以使用
[0123456789]
0|1|2|3|4|5|6|7|8|9
[0-9]
\d
3) 要求是 18 位. 限定 18 位, 即 {18}
組合: ^[0123456789]{18}$
如果最後一位是X
前面 17 位數字: ^[0123456789]{17}$
後面要麼是數字: [0123456789] 要麼是 x: x
寫法: [0123456789x]
[0123456789]|x
0|1|2|3|4|5|6|7|8|9|x
最終得:
^[0123456789]{17}[0123456789x]$
或
^[0-9]{17}([0-9]|X)$
2> 匹配郵箱
結尾還能是
.cc
.org
.edu
.中文
...
名字 @ 主機名
1) 是要驗證郵箱, 那麼就需要使用 ^ $
2) 名字:
數字與字母
[0123456789]
[abcdefghi...]
[ABCDEFG...]
[ ] 裡面的字元如果是編碼序號連續的可以使用連字元連接
數字: [0-9]
[9-0] 錯誤的, 編碼逆序
字母: [a-z]
[A-Z]
整合: [0-9a-zA-Z]
名字的變式方法: [0-9a-zA-Z]+
3) 主機名
主機名也是一串字元串或數字
但是它多了一個 .com .cn
3.1) 只有名字 [0-9a-zA-Z]+
3.2) 只含有一個 .什麼
開始 \.
中間 [0-9a-zA-Z]+
只含有一個名字: \.[0-9a-zA-Z]+
3.3) 含有多個名字
.com.con.cc.c1.c2.c3
即 .什麼 出現一次到多次
(\.[0-9a-zA-Z]+)+
最後主機名可以寫成
[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+
最後整合一下
/^[0-9a-zA-Z]+@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$/
八、 匹配一個數字
1> 匹配一個數字
[0-9]+
1) 由於是匹配, 包含 ^ $
2) 首先第一個字元不允許是 0, 所以第一個可以寫成 [1-9]
3) 後面的數字就是 [0-9]
4) 要求後面的數字出現 0 次到多次, 以匹配任意的 非 0 數字: [1-9][0-9]*
5) 由於還需要考慮 0, 因此寫成 [1-9][0-9]*|0
6) 考慮 | 優先順序最低: ^([1-9][0-9]*|0)$
/^(-?[1-9][0-9]*|0)$/
2> 匹配一個指定範圍的數字
匹配 0 ~ 255 為例
如果寫成這樣子:
[0-255]0, 1, 2, 5錯誤的
如果要匹配指定範圍的數字, 那麼需要將字元串結構進行分類
1) 0 要匹配的, 所以在正則表達式中有 0 這一項
2) 任意的 2 位數, 即 [1-9][0-9]
3) 任意的 1 位數, 即 [0-9], 可以將 第 1) 結論合併
4) 考慮 3 位數的時候, 只允許出現 1xx 的任意數, 而 2xx 的有限制
因此在分組, 考慮 1xx 的任意數, 可以寫成: 1[0-9][0-9]
5) 考慮 2xx 的數字, 在 200 到 250 之間允許任意取. 所以
寫成: 2[0-4][0-9]
6) 考慮 250 到 255, 寫成 25[0-5]
綜合一起:
/^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/
或
/^([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))$/
3> 匹配小數
要求, 小數不允許以 0 結尾
3.1415
/^(-?([1-9][0-9]*|0))(\.[0-9]*[1-9])?$/;
(aaa)?這個內容出現或不出現
(aaa|)也是表達aaa可出現可不出現
^((-?[1-9][0-9]*|0)(\.[0-9]*[1-9]|))$
九、簡寫元字元
\s [\f\r\n\t\v] 不可見字元 (空白字元, 包括空格, tab, 回車換行)等
\S [^/f/r/n/t/v] 可見字元 (非空白字元)
js 中常常使用 [\s\S] 表示任意字元
\w [a-zA-Z0-9]_ 單詞字元(表示