方括號的細節問題
- 表示方括號中的部分特殊元字符中的任意一個 表明該字符的原義 除了\n以外
- 不能識別多位數
- 中括號範圍[0-9][a-z][A-Z] 當須要一個數字的範圍時 拆分字段
正則捕獲
RegExp.prototype.exec()方法 ###正則捕獲的懶惰性bash
- 正則每次捕獲的時候都是從索引 0 開始,捕獲到第一個符合條件的就中止捕獲 後面就不會捕獲
- 解決: 在後面加g
正則對象一個屬性lastIndex屬性
- 記錄下一次匹配或捕獲起始位置 下一次再捕獲或匹配時 就會從這個位置開始向後查找
match 方法配合正則 String.prototype.match()
match 使用的正則不加 g 時返回值和 exec 是同樣的。可是若是有 g 時,match 方法會一次性把全部符合條件的都匹配到,而 exec 每次只能匹配到一個;ui
正則分組捕獲 除了匹配還能夠把符合條件的捕獲到
捕獲的返回值 ["大正則捕獲到的","分組1捕獲內容","分組2捕獲內容"] match方法不能進行分組匹配編碼
取消分組 (?:) 改變優先級 而不做分組捕獲
小括號的細節問題
- 分組捕獲
- 分組引用\數字 表引用前面分組某個分組的內容
- 改變優先級
正則捕獲的貪婪性
- 若是正則匹配到符合規則的字符串,那麼捕獲的時候會按照最長的捕獲
- 解決 在量詞元字符後面增長 ? 增長後 按照最少的匹配
正則的簡單應用
- 驗證中國大陸手機號 以1 開頭的11位數 let reg = /^1\d{10}$/
- 驗證某些號段的手機號驗證 let /^(88|70|56)\d{8}$/
- 匹配尾號連續的三個數字 let reg = /^1\d{7}(\d)(\1{2})$/
- 靚號 let reg = /^1\d{2}(\d)\1{3}(\d)\2{3}$/
- 有效數字的驗證 let reg = /?(\d|[1-9]\d+)(.\d+)?$/
- 匹配中文姓名 中文的 Unicode 編碼範圍 \u4e00-\u9fa5 let reg = /{2,6}$/
- 郵箱驗證 let reg = /+@[a-zA-Z\d]+(.[a-z]+){1,2}$/
- 數據類型檢測
Object.isTypeOf = function (val) {
let res = Object.prototype.toString.call(val); // "[object Xxxx]"
let reg = /^\[object ([a-zA-Z]+)\]$/; // 在正則使用某些特殊元字符的原義時須要轉義
let exec = reg.exec(res)[1];
return exec.toLowerCase();
};
console.log(Object.isTypeOf(1));
複製代碼
正向預查 (?=元字符) 不發生分組捕獲 前面元字符後面必須是?=中元字符
負向捕獲 (?!元字符) 不發生分組捕獲 前面元字符後面不是是?!中元字符
正則的高級應用
- 配合replace使用 String.prototype.replace(匹配內容,'替換內容')
- 一次只能替換一個 一次所有提換掉 replace(正則,callback)
- 格式化時間字符串
- 獲取時間字符串中全部時間數字 let reg = /\d+/g
- 判斷若數字小於10 前面補0 let add = arr.map(item=>+item<10 ? '0' + item : item)
- 格式化時間
let tmpReg = /\{(\d)\}/g;
let result2 = tmp.replace(tmpReg, function ([, index]) {
return ary[index];
});
複製代碼
let reg3 = /([^?=&]+)=([^?=&]+)/g;
url.replace(reg3, (str, key, value) => params[key] = value);
複製代碼
- 獲取數據類型 let reg = /^[object ([a-zA-Z]+)]$/