ES6扩展 正则扩展

复习:正则表达式

简单来说就是用一定的规则去查找、替换符合这个规则的文本。

JS中生成RegExp对象的两种方法

  • RegExp 对象表示正则表达式
  • 修饰符 包含属性 “g”、”i” 和 “m”,分别用于指定 全局匹配、区分大小写的匹配和多行匹配
  • 方法1:使用直接量的方式, 规则用//包裹起来,修饰符跟在后面:
    1
    2
    3
    const regexp1=/规则/修饰符;
    // 例子: ^表示开头,g表示全局匹配。即:开头为a的字符串就满足这个正则表达式
    const regexp1=/^a/g;
  • 方法2:使用构造函数RegExp的方式, 规则和修饰符都用引号包裹起来:
    1
    2
    3
    const regexp2=new RegExp('规则','修饰符');
    // 例子:
    const regexp2=new RegExp('^a','g');
    1
    2
    3
    const regexp2=new RegExp(/规则/修饰符);
    // 例子:
    const regexp3=new RegExp(/^a/g);

正则方法

match() exec()
字符串的正则方法,使用字符串对象进行调用 正则对象的方法,使用RegExp对象进行调用
返回的是匹配完成后完整的数组 每调用一次返回单次对应的匹配结果并用数组的方式显示
  • 区分match()exec()的例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const r1 = /imooc/g;

    const str = "imoocimooc_imooc";

    console.log(r1.exec(str));//["imooc", index: 0, input: "imoocimooc_imooc", groups: undefined]
    console.log(r1.exec(str));//["imooc", index: 5, input: "imoocimooc_imooc", groups: undefined]
    console.log(r1.exec(str));//["imooc", index: 11, input: "imoocimooc_imooc", groups: undefined]
    console.log(r1.exec(str));//null

    console.log(str.match(r1));//["imooc", "imooc", "imooc"]

match() 方法

  • match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
  • 该方法类似 indexOf() 和 lastIndexOf(),但是它**返回指定的值(数组)**,而不是字符串的位置。
  • 返回值:存放匹配结果的数组
  • 语法
    1
    2
    stringObject.match(searchvalue)
    stringObject.match(regexp)
参数 描述
searchvalue 必需。规定要检索的字符串值。
regexp 必需。规定要匹配的模式的 RegExp 对象。
如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。
  • 例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //^表示开头,g表示全局匹配。即:开头为"你"的字符串就满足这个正则表达式
    const regexp1 = /^你/g;
    console.log("你好呀你好呀你好呀".match(regexp1)); //["你"]

    const regexp2 = new RegExp("^你好", "g"); //不要漏掉g的引号
    console.log("你好呀你好呀你好呀".match(regexp2));//["你好"]

    const regexp3 = new RegExp(/^我/g);
    console.log("你好呀你好呀你好呀".match(regexp3));//null,不符合规则

    const regexp4 = /你/g; //去掉^
    console.log("你好呀你好呀你好呀".match(regexp4));//["你", "你", "你"]

    const regexp5 = /你/; //去掉g,不再全局搜索
    console.log("你好呀你好呀你好呀".match(regexp5));//["你"]

exec()方法

  • exec() 方法用于使用正则表达式,检索字符串中的正则表达式的匹配。
  • 语法RegExpObject.exec(要检索的字符串)
  • 返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null
  • 与match()类似,他们都是返回匹配结果的数组,但match()是字符串的正则方法(是使用字符串对象进行调用),exec()是正则对象的方法(使用RegExp对象进行调用)
  • 例子:在下面y粘连修饰符的例子中使用。

test()方法

  • test()方法用于检测一个字符串是否匹配某个模式.
  • 返回值:布尔型。如果字符串中有匹配的值返回 true ,否则返回 false。
  • 注意:和match()类似,不过他返回的是布尔值而不是匹配值构成的数组。
  • 语法RegExp对象.test(要检测的字符串)
  • 例子:在下面u修饰符的例子中使用。

正则表达式构造函数RegExp的变化

不管有多少个“原来的修饰符”,都会被“新增的修饰符”覆盖,注意:新增的修饰符需要引号

1
const regexp = new RegExp(/规则/原来的修饰符,"新增的修饰符");

例子:

1
const regexp = new RegExp(/^你/igm,"i");//最后生效的是i

新增的u、y修饰符

u修饰符

  • ES6 对正则表达式添加了 u 修饰符,含义为 “Unicode模式”,用来正确处理大于\uFFFF的Unicode字符。
  • u修饰符的作用:使得要检测的字符串会被识别成一个字符而不是拆分成几个字符。使得可以正确处理四个字符的 UTF-16 编码
  • 例子:
    1
    2
    3
    4
    //匹配开头为“\ud83d”的字符串,结果返回true,可是"\ud83d\udc36""🐶"
    console.log(/^\ud83d/.test("\ud83d\udc36"));//true
    //加上u修饰符:
    console.log(/^\ud83d/u.test("\ud83d\udc36"));//false
  • 例子分析
    • 上面代码中,\ud83d\udc36 是一个四字节的UTF-16 编码,代表一个字符小狗”🐶”
    • 但是,ES5不支持四个字节的 UTF-16 编码,会将其识别为两个字符,导致第一行代码结果为 true。
    • 加了u修饰符以后,ES6就会识别其为一个字符,所以第二行代码结果为false。

y 粘连修饰符

  • y即 sticky(adj. 粘的;粘性的)
  • y修饰符和g修饰符很像,他们都是全局匹配的,但y修饰符需要匹配到的第1个和第2个规则直接相粘连才能匹配到第2个,第一个匹配结束以后如果不是马上遇到第2个就停止匹配,返回null。
  • 例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const r1 = /imooc/g;
    const r2 = /imooc/y;

    const str = "imoocimooc_imooc";

    console.log(r1.exec(str)); // ['imooc', index: 0, input: 'imoocimooc_imooc', groups: undefined]
    console.log(r1.exec(str)); // ['imooc', index: 5, input: 'imoocimooc_imooc', groups: undefined]
    console.log(r1.exec(str)); // ['imooc', index: 11, input: 'imoocimooc_imooc', groups: undefined]
    console.log(r1.exec(str)); // null

    console.log("-----------我是分割线-------------");

    console.log(r2.exec(str)); // ['imooc', index: 0, input: 'imoocimooc_imooc', groups: undefined]
    console.log(r2.exec(str)); // ['imooc', index: 5, input: 'imoocimooc_imooc', groups: undefined]
    console.log(r2.exec(str)); // null
  • 例子分析
    • 可以看到全局匹配则可以的到3个“imooc”,而使用y(粘连修饰符)只能匹配到2个“imooc”。
    • 这是因为y需要匹配到的第一个和第二个规则直接相粘连才能匹配到第2个,在这个例子中第二个“imooc”匹配完以后出现了-于是就停止匹配了。