1.RegExp構造函數 ES5中有兩種情況 註意!!! ES6的改變 2.字元串的正則方法 match() 方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配 replace() 方法用於在字元串中用一些字元替換另一些字元,或替換一個與正則表達式匹配的子串 search() 方法用於檢 ...
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(/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'}