JS中的正则的使用

243 阅读3分钟

序言

  • 首先,正则表达式是正则表达式,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"]

工具

在线工具1

在线工具2

在线工具3

教程

三十分钟学会正则