正則的擴充套件

妖色調發表於2019-01-19

1.RegExp建構函式

ES5中有兩種情況
let regex = new RegExp(`xyz`, `i`)
// 等價於
let regex = /xyz/i

let regex = new RegExp(/xyz/i)
// 等價於
let regex = /xyz/i

注意!!!

let regex = new RegExp(/xyz/, `i`)
// 這種寫法是錯誤的
ES6的改變
new RegExp(/abc/ig, `i`).flags
// 第二個引數i會將前面的ig進行覆蓋

2.字串的正則方法

  • match() 方法可在字串內檢索指定的值,或找到一個或多個正規表示式的匹配
let str="1 plus 2 equal 3"
str.match(/d+/g)
// [`1`,`2`,`3`]
  • replace() 方法用於在字串中用一些字元替換另一些字元,或替換一個與正規表示式匹配的子串
let str = `nihao Jack`
str.replace(/Jack/, `Lucy`)
// nihao Lucy
  • search() 方法用於檢索字串中指定的子字串,或檢索與正規表示式相匹配的子字串
let str = `good body`
str.search(/body/)
// 5

let str = `good body`
str.search(/girl/)
// -1
  • split() 方法用於把一個字串分割成字串陣列
let str = `good body`
str.split(`o`)
["g", "", "d b", "dy"]

3.u修飾符

  • ES6 對正規表示式新增了u修飾符,含義為“Unicode 模式”,用來正確處理大於uFFFF的 Unicode 字元。也就是說,會正確處理四個位元組的 UTF-16 編碼。

4.RegExp.prototype.unicode 屬性

  • 正則例項物件新增unicode屬性,表示是否設定了u修飾符
let str = /hello/;
let str2 = /hello/u;

str.unicode // false
str2.unicode // true

5.y修飾符

  • y修飾符,叫做“粘連”(sticky)修飾符。
  • y修飾符的作用與g修飾符類似,也是全域性匹配,後一次匹配都從上一次匹配成功的下一個位置開始。不同之處在於,g修飾符只要剩餘位置中存在匹配就可,而y修飾符確保匹配必須從剩餘的第一個位置開始,這也就是“粘連”的涵義。
let str = `aaa_aa_a`
let reg1 = /a+/g
let reg2 = /a+/y

reg1.exec(s) // [`aaa`]
reg2.exec(s) // [`aaa`]

reg1.exec(s) // [`aa`]
reg2.exec(s) // null y修飾符從剩餘項的第一個位置開始(即_)所以找不到

lastIndex屬性可以指定每次搜尋的開始位置

reg2.lastsIndex = 1
reg2.exec(s) // [`aa`]

實際上y修飾符號隱含了頭部匹配的標誌^
  • 單單一個y修飾符對match方法,只能返回第一個匹配,必須與g修飾符聯用,才能返回所有匹配。
`a1a2a3`.match(/ad/y) // [`a1`]
`a1a2a3`.match(/ad/gy) // [`a1`,`a2`,`a3`]

6.RegExp.prototype.sticky 屬性

  • 表示是否設定了y修飾符

7.RegExp.prototype.flags 屬性

  • 會返回正規表示式的修飾符

8.s 修飾符:dotAll 模式

9.後行斷言

10.Unicode 屬性類

11.具名組匹配

  • 正規表示式使用圓括號進行組匹配
const REG = /(d{4})-(d{2})-(d{2})/

const matchObj = REG.exec(`1999-12-31`)
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31

問題: 只能用數字序號引用,組的順序改變,引用的時候就必須修改序號

  • 具名組匹配,允許為每一個組匹配指定一個名字,既便於閱讀程式碼,又便於引用
const REG = /(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/

const matchObj = REG.exec(`1999-12-31`)
const year = matchObj.groups.year // 1999
const month = matchObj.groups.month // 12
const day = matchObj.groups.day // 31

如果具名組沒有匹配,那麼對應的groups物件屬性會是undefined

12.解構賦值和替換

  • 有了具名組匹配以後,可以使用解構賦值直接從匹配結果上為變數賦值
let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec(`foo:bar`)

console.log({one, two}) // {one: `foo`, two: `bar`}

相關文章