正則的擴展

1.RegExp構造函數

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

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

注意!!!es6

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(/a\d/y) // ['a1']
'a1a2a3'.match(/a\d/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'}
相關文章
相關標籤/搜索