(1)参数字符串,参数一位字符串,此时第二个参数表示正则表达式的修饰符(flag)
var regex = new RegExp('xyz','i'); 等价于 var regex = /xyz/i;(2)正则表达式,参数一为正则表达式,此时会返回原有的正则表达式
var regex = new RegExp(/xyz/i); 等价于 var regex = /xyz/i;(3)若RegExp构造函数的参数一为正则对象,参数二可用于指定修饰符,那么指定的修饰符会覆盖前面的修饰符。
var regex = new RegExp(/abc/ig,'i'); alert(regex.flags); //"i"字符串对象共有4个方法可以使用正则表达式:match(),replace(),search(),split(). ES6将这四个方法全部调用RegExp方法:
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]
用于处理大于\uFFFF的Unicode字符。
/^\uD83D/u.test('\uD83D\uDC2A') // false,用了u修饰符,后面是一个字符 /^\uD83D/.test('\uD83D\uDC2A') // true,没有用u修饰符,第一个能匹配到(1)点字符:在正则表达式中代表除换行符以外的任意单个字符。对于大于0xFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。
var s = '𠮷'; // false,不加u修饰符,会被认为是两个字符,匹配失败 /^.$/.test(s) /^.$/u.test(s) // true(2)Unicode字符表示法 ES6新增用 { } 表示Unicode字符,但必须用u修饰符。
/\u{61}/.test('a') // false,没有用u修饰符,会识别连续的61个a /\u{61}/u.test('a') // true /\u{20BB7}/u.test('𠮷') // true(3)量词 使用u修饰符后,所有量词都会识别码点大于0xFFFF的Unicode字符
/a{2}/.test('aa') // true /a{2}/u.test('aa') // true /𠮷{2}/.test('𠮷𠮷') // false /𠮷{2}/u.test('𠮷𠮷') // true(4)预定义模式 u修饰符也能影响到预定义模式,能否正确识别码点
/^\S$/.test('𠮷') // false /^\S$/u.test('𠮷') // true(5)i修饰符 有些字符编码不同但是字型相近,如:\u0048,\u212A都是大写的K。
/[a-z]/i.test('\u212A') // false /[a-z]/iu.test('\u212A') // true(6)转义 没有u修饰符的时候,转义无效;
/\,/ 输出:/\,/没有u修饰符时,转义报错。
/\,/u // 报错正则新增unicode属性,用来表示是否设置了u修饰符
const r1 = /hello/; const r2 = /hello/u; r1.unicode // false r2.unicode // true与g修饰符类型,都是全局匹配,后一次匹配从上一次匹配的下一个位置开始;不同自安于,g修饰符只要剩余里存在匹配要可以,而y修饰符必须从剩余位置的第一个位置开始。
var s = 'aaa_aa_a'; var r = /a+_/y; r.exec(s) // ["aaa_"] r.exec(s) // ["aa_"]表示是否设置了y修饰符
var r = /hello\d/y; alert(r.stricky); //trueflags属性返回修饰符
alert(/abc/ig.flags);ES5的source属性,可以返回正则表达式的正文
alert(/abc/ig.source);(.)修饰符:点代表任意单个字符,但有两个例外。 (1)一个四字节的UTF-16字符,用u修饰符可以解决 (2)另一个是行终止符,有4个(\u000A:换行符;\u000D:回车符;\u2028:行分隔符;\u2029:段分隔符) (.)不会匹配到这4个终止符。
/foo.bar/.test(`foo\nbar`); //false,(.)不能替换掉\n /foo[^]bar/.test('foo\nbar'); //true,[^]可以替换\n新的类\p{…},\P{…},允许正则表达式匹配符合Unicode某种属性的所有字符,必须使用u修饰符。
属性类:(1)属性名(2)属性值。对于某些属性,可以只有属性名或属性值。\p{属性名=属性值}\P{…}是\p{…}的反向匹配,匹配的是不满足条件的字符。(1)简介:使用()匹配数据,用exec()方法;
const a = /(\d{4})-(\d{2})-(\d{2})/; const b = a.exec('1999-12-31'); /*b[1]==1999 b[2]==12 b[3]==31*/ 具名组匹配为每一项加了名称。格式:问号+尖括号+组名 如:?< year > 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一次取出所有匹配,返回遍历器,可用for…of循环取出。若要转换成数组,可用Array.front().即:
// 转为数组的方法一 [...string.matchAll(regex)] // 转为数组的方法二 Array.from(string.matchAll(regex)) const string = 'test1test2test3'; const regex = /t(e)(st(\d?))/g; for (const match of string.matchAll(regex)) { console.log(match); } // ["test1", "e", "st1", "1", index: 0, input: "test1test2test3"] // ["test2", "e", "st2", "2", index: 5, input: "test1test2test3"] // ["test3", "e", "st3", "3", index: 10, input: "test1test2test3"]