正則捕獲

方括號的細節問題

  • 表示方括號中的部分特殊元字符中的任意一個 表明該字符的原義 除了\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 = /[1]?(\d|[1-9]\d+)(.\d+)?$/
  • 匹配中文姓名 中文的 Unicode 編碼範圍 \u4e00-\u9fa5 let reg = /[2]{2,6}$/
  • 郵箱驗證 let reg = /[3]+@[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];
});
複製代碼
  • url 查詢參數格式化
let reg3 = /([^?=&]+)=([^?=&]+)/g;
url.replace(reg3, (str, key, value) => params[key] = value);
複製代碼
  • 獲取數據類型 let reg = /^[object ([a-zA-Z]+)]$/

  1. +- ↩︎url

  2. \u4d00-\u9fa5 ↩︎spa

  3. a-zA-Z\d ↩︎prototype

相關文章
相關標籤/搜索