正则表达式(基础篇)

470 阅读2分钟

正则表达式在我们平时的开发中非常重要,以下仅是将常用的一些基础知识做个总结,方便以后查阅。

作用

正则表达式是用来处理字符串匹配强大的工具

声明

  1. 构造函数
const reg = new RegExp(pattern[,flags]);
// pattern: 正则表达式内容(字符串);也可以是正则表达式(如果是正则表达式,flags则必须忽略)
// flags: 匹配参数(下面列举的为常用)
// g => 全局匹配(默认匹配到第一个就结束了)
// i => 忽略大小写匹配
// m => 匹配多行
  1. 字面量
const reg = /\d+/gi;
// 两个斜杆中间的是正则表达式的内容,之后的g和i表示全局匹配和忽略大小写

我们在实际开发中一般还是使用字面量语法来声明

常见特殊字符

  1. 角色类
// . => 匹配任何单个字符除了换行符 \n \r 和行结束符 \u2028(行分隔符) \u2029(段落分隔符)

// \d => 匹配数字,相当于 [0-9]
// \D => 匹配非数字,相当于 [^0-9]

// \w => 匹配字母数字和下划线,相当于 [a-zA-Z0-9_]
// \W => 匹配非字母数字和下划线,相当于[^a-zA-Z0-9_]

// \s => 匹配单个空格字符,包括空格、tab、换行符等,相当于 [\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
// \S => 匹配非空白字符

// \b => 匹配单词边界
// \B => 匹配非单词边界
  1. 字符集
// [abc] => 匹配方括号中的任意字符(abc)
// [a-z] => 匹配小写a到小写z的字符
// [^abc] => 匹配abc之外的任意字符
// [^a-z] => 匹配小写a-z之外的任意字符
// [\u4e00-\u9fa5] => 匹配汉字
  1. 其他
// a|b => 匹配a或b

// ^ => 匹配输入的开头;若multiline设为true,也可匹配换行后的开头;
// $ => 匹配输入的结尾;若multiline设为true,也可匹配换行前的结尾;
// eg:
/^a/.test('abc');   // true
/^a/.test('bac');   // false

// n* => 匹配零个或多个n的字符串
// n+ => 匹配一个或多个n的字符串
// n? => 匹配零个或一个n的字符串
// n{X} => 匹配包含X个n的字符串
// n{X,Y} => 匹配包含X到Y个n的字符串
// n{X,} => 匹配至少X个n的字符串
// ?=n => 匹配任何其后紧接着n的字符串
// ?!n => 匹配任何其后没有紧接着n的字符串

// () => 分组

^ 在 [] 内表示取反,否则表示匹配开头

如果要匹配特殊字符,需要在前面加 \ 转义

常用方法

  1. 检测是否匹配
  • RegExp.test(String): 检测该字符串是否匹配该正则表达式;若匹配返回true,否则返回false

  • String.search(RegExp): 功能同上;若匹配返回相匹配的起始位置,否则返回-1

search()方法只匹配一次,它会忽略全局匹配标识g

  1. 匹配结果
  • RegExp.exec(String): 检索字符串中正则表达式的匹配;如果匹配成功,返回一个数组(第0个元素是完整的字符串匹配,若正则表达式分组,后面的元素依次是匹配到各个分组的),并更新正则表达式对象的属性(如lastIndex等);如果匹配失败,返回null

  • String.match(RegExp|searchValue): 在字符串内检索指定的值(参数可以是普通字符串和正则表达式)

以下说明来自W3C

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

看个例子:

'123zq3q123w4'.match(/[0-9]+/g);
// ["123", "3", "123", "4"]
'123zq3q123w4'.match(/[0-9]+/);
// ["123", index: 0, input: "123zq3q123w4", groups: undefined]
  1. 替换
  • String.replace(RegExp/substr, replacement): 用于在字符串中用一些字符替换另一些字符,或替换与正则表达式相匹配的字符串;它返回一个替换之后的新的字符串。

replacement可以是字符串也可以一个函数;如果是字符串,有以下特殊字符:

'$1'、'$2'、'...'、'$99'    // 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本
'$&'  // 与 regexp 相匹配的子串
'$`'  // 位于匹配子串左侧的文本
'$''  // 位于匹配子串右侧的文本
'?'  // 直接量符号

如果是函数:需要返回一个字符串作为替换字符串(这种情况用的比较少)

结束

这些都是基础知识,没什么干货,发出来只是为了方便自己以后查找。

参考: RegExp - JavaScript | MDNJavaScript RegExp 对象