1. 什麼是正則
1. 正則只和字符串有關,換言之正則只和字符串打交道;
2. 正則用來操作(匹配和捕獲)字符串的一系列規則;
匹配:判斷你是否符合我的規則: 返回值:布爾值; test
捕獲:把符合我們規則的內容拎出來; 拿到的:字符串;
2. 正則的定義
正則創建的兩種方式:字面量 和 實例
兩種創建方式的區別:
1)實例創建時,特殊含義的字符需要轉義(\);
2)實例創建可以進行變量的拼接,但是字面量方式創建,不能拼接變量;
var reg=/\d/; // 字面量創建
var reg=new RegExp('^'+str+'$'); // 實例創建
3. 正則由兩部分組成:元字符 和 修飾符
元字符包含:代表特殊意義的元字符 和 代表次數的量詞元字符
1. 代表特殊意義的元字符:
\ ---- 轉義字符
| ---- 或
() ---- 分組
. ---- 除了\n以外的其他字符
\n ---- 換行(一般用在控制檯的換行)
\b ---- 開頭結尾和空格
^
$
\d 數字 \w 數字字母下劃線 \s 空格
\D 非數字 \W 非數字字母下劃線 \S 非空格
[abc] abc三個中的任何一個 [^abc] 除了abc這三個的任何一個
[a-z] 字母中的任何一個 [^a-z] 非字母
2. 代表次數的量詞元字符:
* 0到多
+ 1到多
? 0次或1次;
{n} 正好幾次
{n,} 至少n次
{n,m} n次到m次
修飾符:
g 全局 global
i 忽略大小寫
m 換行操作
4. 常用的正則判斷
1. 有效電話號碼
var reg = /^1/d{10}$/;
2. 身份證號碼
var reg = /^(\d{17})(\d|X)$/; // 最後一位有可能是X
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/
3. 23或者24
var reg = /^(23|24)$/ // 用到或的時候一定要加()
4. 年齡在18~67歲之間
var reg = /^(18|19)|([2-5]\d)|(6[0-7])$/;
5. 去除數位空格
var reg = /(^ +)|( +$)/;
6. 非空驗證
var reg = /^\s+$/;
7. 郵箱驗證
var reg = /^([\w.-]+)@([0-9a-zA-Z]+)(\.[a-zA-Z]{2,4}){1,2}$/
8. 中文名字
var reg = /^[\u4e00-\u9fa5]{1,4}$/ // 基本漢字的Unicode碼範圍: 4E00-9FA5
9. 偷小說:
var reg=/<[^<>]+>/g;
5. 工作中遇到的正則
1. 密碼匹配: 要求8~30位,同時包含:大寫字母、小寫字母、數組的字符串
/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]*$/
2. 8 - 30 個字符,必須同時包含三項(大寫字母、小寫字母、數字、 ()`~!@#$%^&*-+=|{}[]:;'<>,.?/ 中的特殊符號)。
/(?=^.{8,30}$)(?!^[\d\W_]*$)(?!^[\da-z]*$)(?!^[\dA-Z]*$)(?!^[\W_a-z]*$)(?!^[\W_A-Z]*$)(?!^[a-zA-Z]*$).*$/
6. 正則捕獲的特點:
1. 懶惰性:解決辦法-用全局g;
eg:每次都是從索引0開始查找;
用了全局g,lastIndex每次查找都是從找到內容的下一個元素的索引開始查找;
2. 貪婪性:解決辦法-用?
7. 懶惰性
每一次執行exec只捕獲第一個匹配的內容,在不進行任何處理的情況下,在執行多次捕獲,捕獲的還是第一個匹配的內容。
例子:
var reg = /\d+/;
var str = 'qweasd2016qazwsx2017';
var res = reg.exec(str);
console.log(res) // ['2016',index:6,input:'qweasd2016qazwsx2017']
//第二次通過exec捕獲的內容還是第一個"2016"
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'qweasd2016qazwsx2017']
解決的方法: — g
var reg = /\d/g;
var str = 'woshi2016ni2017';
console.log(reg.lastIndex) // 0
console.log(reg.exec(str)) // ["2", index: 5, input: "qweasd2016qazwsx2017"]
8. 貪婪性
貪婪性 正則的每一次捕獲都是按照匹配最長的結果捕獲的,例如:2符合正則、2015也符合正則,我們默認捕獲的是2015
例子:
var reg = /\d+/g;
var str = 'as2015xs2016er2017';
console.log(reg.exec(str)); //["2015", index: 2, input: "as2015xs2016er2017"]
解決辦法: —– ?
var reg = /\d+?/g;
var str = 'as2015xs2016er2017';
console.log(reg.exec(str)); // ["2", index: 2, input: "as2015xs2016er2017"]