ES6擴(kuò)展
1.RegExp 構(gòu)造函數(shù)
- ES5中克蚂,RegExp構(gòu)造函數(shù)的參數(shù)有兩種情況。
var regex = new RegExp('xyz', 'i');
// 等價于
var regex = /xyz/i;
var regex = new RegExp(/xyz/i);
// 等價于
var regex = /xyz/i;
// 不允許眷细,報(bào)錯
var regex = new RegExp(/xyz/, 'i');
ES6中膛虫,支持如上正則寫法
new RegExp(/abc/ig, 'i')
// 原有正則對象中的修飾符(flag)ig,將會被第二個參數(shù)i覆蓋
2.改變字符串正則方法的調(diào)用
match()、replace()、search()和split()
String.prototype.match 調(diào)用 RegExp.prototype[Symbol.match]
String.prototype.replace 調(diào)用 RegExp.prototype[Symbol.replace]
String.prototype.search 調(diào)用 RegExp.prototype[Symbol.search]
String.prototype.split 調(diào)用 RegExp.prototype[Symbol.split]
3.u 修飾符氛改,用來正確處理大于 \uFFFF的Unicode 字符
(1)點(diǎn)字符:除了換行符以外的任意單個字符帐萎,大于 \uFFFF 的 Unicode 字符無法識別
var s = '??';
/^.$/.test(s) // false
/^.$/u.test(s) // true
(2) Unicode 字符表示法
\u{61}/.test('a') // false
/\u{61}/u.test('a') // true
/\u{20BB7}/u.test('??') // true
(3) 量詞:正確識別碼點(diǎn)大于 0xFFFF 的 Unicode 字符
/a{2}/.test('aa') // true
/a{2}/u.test('aa') // true
/??{2}/.test('????') // false
/??{2}/u.test('????') // true
(4) \S 預(yù)定義模式,匹配所有非空白字符胜卤;影響同上
/^\S$/.test('??') // false
/^\S$/u.test('??') // true
function codePointLength (text) {
var result = text.match(/[\s\S]/gu);
return result ? result.length : 0
}
var s = '????';
s.length // 4
codePointLength(s) // 2
(5) 與 i 修飾符,識別非規(guī)范的字符
/[a-z]/i.test('\u212A') // false
/[a-z]/iu.test('\u212A') // true
4.RegExp.prototype.unicode 屬性:表示是否設(shè)置了u修飾符
const r1 = /hello/;
const r2 = /hello/u;
r1.unicode // false
r2.unicode // true
- y 修飾符疆导,粘連(sticky)修飾符
y 修飾符與g修飾符類似,也是全局匹配葛躏,后一次都從上一次匹配成功的下一個位置開始- g 修飾符:只要剩余位置中存在匹配即可
- y 修飾符: 匹配必須從剩余的第一個位置開始澈段,不滿足返回 null
6.RegExp.prototype.sticky 屬性:表示是否設(shè)置了y修飾符
var r = /hello\d/y;
r.sticky // true
7.RegExp.prototype.flags 屬性:會返回正則表達(dá)式的修飾符
ES2018擴(kuò)展
8.s 修飾符:dotAll 模式
- 引入s修飾符,使得.可以匹配任意單個字符
// 匹配的是任意單個字符寫法
/foo[^]bar/.test('foo\nbar') // true
// 上面的解決方案不太符合直覺
/foo.bar/s.test('foo\nbar') // true
9.后行斷言
...
10.Unicode 屬性類
引入了一種新的類的寫法\p{...}和\P{...}舰攒,允許正則表達(dá)式匹配符合 Unicode 某種屬性的所有字符
語法如下:Unicode 屬性類要指定屬性名和屬性值
\p{UnicodePropertyName=UnicodePropertyValue}
\P{…}是\p{…}的反向匹配败富,即匹配不滿足條件的字符,這兩種類只對Unicode字符有效摩窃,使用時一定要加上U 修飾符
// 匹配所有數(shù)字
const regex = /^\p{Number}+$/u;
regex.test('231???') // true
regex.test('???') // true
regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ') // true
11.具名組匹配
正則表達(dá)式使用圓括號進(jìn)行組匹配
const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31
為了便于閱讀與引用兽叮,引入了具名匹配
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31
語法如下:“具名組匹配”在圓括號內(nèi)部,模式的頭部添加“問號 + 尖括號 + 組名”(?<year>)猾愿,再通過exec 放回結(jié)果的groups 屬性引用該組名
解構(gòu)賦值和替換
解構(gòu)賦值
let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar');
one // foo
two // bar
替換:字符串替換時充择,使用$<組名>引用具名組
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
'2015-01-02'.replace(re, '$<day>/$<month>/$<year>')
// '02/01/2015'
引用:如果要在正則表達(dá)式內(nèi)部引用某個“具名組匹配”,可以使用\k<組名>匪蟀、數(shù)字引用(\1)的寫法
....