JavaScript < ES5、ES6、ES7、… >ECMAScript 6

ES6(五):正则表达式扩展

2018-11-25  本文已影响29人  CodeMT

前面的话


正则表达式是javascript操作字符串的一个重要组成部分,但在以往的版本中并未有太多改变。然而,在ES6中,随着字符串操作的变更,
ES6也对正则表达式进行了一些更新。本文将详细介绍ES6正则表达式扩展

构造函数

varregex =newRegExp('xyz', 'i');// 等价于var regex = /xyz/i;

varregex =newRegExp(/xyz/i);// 等价于var regex = /xyz/i;

// Uncaught TypeError: Cannot supply flags when constructing one RegExp from anothervarregex =new RegExp(/xyz/, 'i');

console.log(newRegExp(/abc/ig, 'i').flags);//i

上面代码中,原有正则对象的修饰符是ig,它会被第二个参数i覆盖

【flags】

//ES5的source属性返回正则表达式的正文/abc/ig.source//"abc"// ES6的flags属性返回正则表达式的修饰符/abc/ig.flags//'gi'

正则方法

String.prototype.match 调用RegExp.prototype[Symbol.match]
String.prototype.replace 调用RegExp.prototype[Symbol.replace]
String.prototype.search 调用RegExp.prototype[Symbol.search]
String.prototype.split 调用 RegExp.prototype[Symbol.split]

u修饰符

/^\uD83D/u.test('\uD83D\uDC2A')// false/^\uD83D/.test('\uD83D\uDC2A')// true

【点号】

var text = "𠮷";
console.log(text.length); // 2console.log(/^.$/.test(text));
//falseconsole.log(/^.$/u.test(text));//true`1

【大括号】

/\u{61}/.test('a')// false/\u{61}/u.test('a')// true/\u{20BB7}/u.test('𠮷')// true

【量词】

/a{2}/.test('aa')// true/a{2}/u.test('aa')// true/𠮷{2}/.test('𠮷𠮷')// false/𠮷{2}/u.test('𠮷𠮷')// true

【预定义模式】

/^\S$/.test('𠮷') // false/^\S$/u.test('𠮷')// true

【字符串长度】

function codePointLength(text) { varresult = text.match(/[\s\S]/gu);
returnresult? result.length : 0;
}var s = '𠮷𠮷';
console.log(s.length); // 4console.log(codePointLength(s));// 2

【检测支持】

function hasRegExpU() { try { varpattern =newRegExp(".", "u");
   returntrue;
    } catch (ex) { return false;
   }
}

y修饰符

【全局匹配】

vars = 'aaa_aa_a';varr1 = /a+/g;varr2 = /a+/y;
console.log(r1.exec(s)); // ["aaa"]console.log(r2.exec(s));
// ["aaa"]console.log(r1.exec(s)); // ["aa"]console.log(r2.exec(s));// null

vars = 'aaa_aa_a';varr = /a+_/y;
console.log(r.exec(s)); // ["aaa_"]console.log(r.exec(s));// ["aa_"]

【非全局匹配】

'a1a2a3'.match(/a\d/y)// ["a1"]'a1a2a3'.match(/a\d/gy)// ["a1", "a2", "a3"]

【stiky属性】

varr = /hello\d/y;
r.sticky // true

【应用】

const TOKEN_Y = /\s*(\+|[0-9]+)\s*/y;
const TOKEN_G = /\s*(\+|[0-9]+)\s*/g;
tokenize(TOKEN_Y, '3 + 4')// [ '3', '+', '4' ]tokenize(TOKEN_G, '3 + 4')// [ '3', '+', '4'
]functiontokenize(TOKEN_REGEX, str) {
   let result =[];
   let match; while(match =TOKEN_REGEX.exec(str)) {
      result.push(match[1]);
   } returnresult;
}

tokenize(TOKEN_Y, '3x + 4')// [ '3' ]tokenize(TOKEN_G, '3x + 4')// [ '3', '+', '4' ]

【检测支持】

function hasRegExpY() { try { varpattern =newRegExp(".", "y");
    return true;
   } catch (ex) { return false;
   }
}

上一篇 下一篇

猜你喜欢

热点阅读