转行学前端的第 45 天 : 了解 ECMAScript RegExp 基础声明和使用

720 阅读3分钟

我是小又又,住在武汉,做了两年新媒体,准备用 6 个月时间转行前端。

今日学习目标

昨天基于搜索来基础学习显式原型隐式原型newinstanceof。今天主要是基于搜索来学习RegExp 的声明基础 ,我基础看了一下内容,感觉要分好几天学习RegExp ~~~~,又是适合学习的一天,加油,小又又!!!!


how

字面量, 构造函数工厂符号都是可以的:

// 字面量
/pattern/flags

// 构造函数
new RegExp(pattern [, flags])

// 工厂符号
RegExp(pattern [, flags])

参数说明

pattern

正则表达式的文本。


flags

如果指定,标志可以具有以下值的任意组合:

名称 具体说明
g 全局匹配;找到所有匹配,而不是在第一个匹配后停止
i 忽略大小写
m 多行; 将开始和结束字符(^$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n\r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。
u Unicode; 将模式视为Unicode序列点的序列
y 粘性匹配; 仅匹配目标字符串中此正则表达式lastIndex属性指示的索引(并且不尝试从任何后续索引匹配)。

use

基础使用

有两种方法来创建一个RegExp对象:一是字面量、二是构造函数

如果pattern字符串或者字面量构成,参数不需要使用引号,而构造函数参数使用引号

因此,以下表达式创建相同的正则表达式

// 字面量
/ab+c/i;

// 构造函数
new RegExp('ab+c', 'i');

// 工厂符号
new RegExp(/ab+c/, 'i');

重新编译

表达式赋值时,字面量形式提供正则表达式的编译(compilation)状态,当正则表达式保持为常量时使用字面量

例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译recompiled)。

而正则表达式对象的构造函数,如 new RegExp('ab+c') 提供了正则表达式运行时编译(runtime compilation)。

如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数

这一段话有点点绕口


字符转义规则

当使用构造函数创造正则对象时,需要常规字符转义规则(在前面加反斜杠 \)。比如,以下是等价的:


new RegExp("\\w+");

/\w+/;

ES6 新支持

ES5中, 当第一个pattern正则对象,不允许此时使用第二个参数添加修饰符,否则会报错TypeError(Uncaught TypeError: Cannot supply flags when constructing one RegExp from another)的异常。

const regex = new RegExp(/xyz/, 'i');
// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another
// 当从其他正则表达式进行构造时不支持标志

ES6 改变了这种行为。如果RegExp构造函数第一个pattern正则对象,那么可以使用第二个参数指定修饰符

而且,返回的正则表达式会忽略原有的正则表达式修饰符,只使用新指定的修饰符


new RegExp(/abc/ig, 'i').flags
// "i"

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


今日学习总结


今日心情

今日主要是基于搜索来学习RegExp 的声明基础 ,知道了RegExp怎么声明的,和基础使用,希望明天学到RegExp 的更多的内容~~~~

本文使用 mdnice 排版