序言
-
首先,正则表达式是正则表达式,js是js,正则表达式对于js来说就像是jquery中一个插件一样,是用来扩展js的功能的,具体来说就是增强js处理文本或字符串的能力。就像运行js需要js引擎,执行正则也需要相应的引擎来完成,在js中解析正则表达式采用的NFA。
-
正则匹配就和打扑克是一样一样的,用手中的牌去组合成不同的可能(备选状态),比方说你有四个二带两王,你可以怎么打?
反正有很多种:比如 四个二带两王、先出两王、先出四个二等等
这个用正则怎么表示呢? 2{0,4}[01]{0,2}
- NFA 和 DFA 的区别
正则表达式的作用
- 数据验证(比如验证手机号、邮箱等)
- 复杂的字符串搜索、替换(比如在一大串文字中找到你的名字、将字母a替换成b等)
- 基于模式匹配从字符串中提取子字符串(比如取出当前页面中所有的a标签等)
在js中,如何创建正则表达式
// 在 js 中正则表达式就是一个对象,构造函数为RegExp
var regex = /pattern/flags; // 字面量
var regex = new RegExp(pattern [, flags]); // 构造函数
var regex = RegExp(pattern [, flags]); // 工厂符号
/ab+c/i;
new RegExp('ab+c', 'i'); new RegExp(/abc/i);
RegExp(/ab+c/, 'i');
注意:当使用构造函数的方式构造正则表达式时,需要在特殊字符前加反斜杠 \ 转义
var re = new RegExp("\\w+"); // 也就是用引号括起来的
var re = /\w+/;
参数
pattern - 正则表达式的文本
flags - 修饰符
g - 全局匹配;找到所有匹配,而不是在第一个匹配后停止
i - 忽略大小写
m - 多行; 将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。
u - Unicode模式; 将模式视为Unicode序列点的序列
y - 粘性匹配; 仅匹配目标字符串中此正则表达式的lastIndex属性指示的索引(并且不尝试从任何后续的索引 匹配)。
/b/y.exec('aba'); // null
/b/.exec('aba'); // ["b"]
s - dotAll模式,匹配任何字符(包括终止符 '\n')。
const re = /foo.bar/; // 一般和 . 一起使用
console.log(re.test('foo\nbar')); // false
const re = /foo.bar/s; // 一般和 . 一起使用
console.log(re.test('foo\nbar')); // true
判断是否为正则对象
/**
* 是否为正则对象
* @param {Object}
* @return {Boolean}
*/
function isRegExp (o){
return o && Object.prototype.toString.call(o) === '[object RegExp]';
}
在 js 中哪些地方可以使用正则表达式
正则表达式中特殊字符的含义
关于引擎
JS是NFA引擎
NFA引擎的特点:
- 以贪婪方式进行,尽可能匹配更多字符
- 急于邀功请赏,所以最最左子正则表达式优先匹配成功,因此偶尔会错过最佳匹配结果(多选条件分支的情况)
console.log('nfa not'.match(/(nfa)|(nfa not)/)); // ["nfa"]
- 回溯
"AB01CD23CD45CEff".match('AB.*CD'); // 返回 ["AB01CD23CD"]
