0%

正则表达式学习笔记

把2017年的笔记整理一下,方便查找。记录了js正则表达式常用的概念、字符、以及方法。

一、RegExp对象

JavaScript通过通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象:

  1. 字面量:var reg = /文本/g
  2. 构造函数:var reg = new RegExp("\\bis\\b\", 'g')

二、修饰符

修饰符 含义
g: glogbal 全文搜索(默认搜索到第一个匹配停止)
i: ignore case 忽略大小写(默认大小写敏感)
m: multiple lines 多行搜索

三、元字符

如(*+$^.|(){}[])等,指在正则表达式中有特殊含义的非字母字符。一般情况下正则表达式的一个字符对应字符串的一个字符。
匹配+等特殊字符,可先转义,再匹配,如string.replace(/[\+]/g, "")

  1. 普通类[]
    若要对应多个字符,可用元字符[]来构建一个简单的类,所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符。
    1
    'a1b2c3d4'.replace(/[abc]/gi, 'X') //"X1X2X3X4"
  2. 反向类[^xx]
    [^..]使用元字符^创建反向类,即不属于某类的内容。
    1
    'a1b2c3d4'.replace(/[^abc]/gi, 'X') //"aXbXcXXX"
  3. 范围类[x-x]
    使用[a-z]来连接两个字符,表示从a到z的任意字符 (包含a,z本身)。在[]组成类的内部可以连写[a-zA-Z]
  4. 预定义类
    正则表达式提供预定义类来匹配常见字符类
字符 等价类 含义
. [^\r\n] 除回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\f\r] 空白符
\S [^\t\n\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母、数字、下划线)
\W [^a-zA-Z_0-9] 非单词字符
5. 边界
常见的边界匹配字符如下
字符 含义
^ 以xxx开始(注意^要写在字符前面)
$ 以xxx结束(注意$要写在字符后面)
\b 单词边界
\B 非单词边界
1
2
'@123@abc@'.replace('^@', 'Q'); //"Q123@abc@" 
'@123@abc@'.replace('@$', 'Q'); //"Q123@abcQ"
  1. 量词
    匹配连续出现多次的字符串(仅作用于紧挨着它的字符)
字符 含义
? 出现零或一次(最多出现一次)
+ 出现一次或多次(至少出现一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次
{0,m} 至多出现m次
  • 贪婪模式
    尽可能多的匹配,直到匹配失败
    1
    '12345678'.replace(/\d{3,6}/g,'X'); //"X78"
  • 非贪婪模式(在量词后边加?
    尽可能少的匹配,一旦匹配成功,不再继续尝试;匹配前面的子表达式零次或一次,等价于 {0,1}
    1
    '12345678'.replace(/\d{3,6}?/g, 'X'); //"XX78"
  1. 分组
    使用()可以达到分组的功能,使量词作用于分组
    1
    'a1b2c3d4'.replace(/([a-z]\d{3})g/, 'X') //"Xd4"
  2. 反向引用
    使用$1、$2、$3...来表示和捕获分组后的内容
    1
    '17741881234'.replace(/(.{3})(.{4})(.{4})/, '$1****$3') //"177****1234"
  3. 忽略分组
    不希望捕获某些分组,只需要在分组内加上?:即可

  4. 使用|可以达到或的效果
  5. 前瞻
    正则表达式从文本头部向文本尾部开始解析。 文本尾部的方向,称为“前”,文本头部称为“后”。 前瞻就是在正则表达式匹配规则的时候,向前检查是否符合断言(条件),后顾/后瞻方向相反。JavaScirpt不支持后顾。符合/不符合 特定断言称为 肯定/正向匹配 和 __否定/负向匹配__。

四、RegExp对象方法

  • RegExp.prototype.test(str)
    用于测试字符串参数中是否存在匹配正则表达式的字符串,若存在返回true,否则返回false
  • RegExp.prototype.exec(str)
    使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。如果没有匹配的文本则返回null,否则返回一个结果数组。

五、String对象方法

  • String.prototype.search(reg)
    用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。方法返回第一个匹配结果的index,查找不到返回-1。search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索。
  • String.prototype.match(reg)
    用于检索字符串,以找到一个或者多个与正则表达式匹配的文本。如果匹配到了一个或多个字符串,则返回一个数组,若没有匹配到,则返回null。它不会忽略全局标志g。
  • String.prototype.split(reg)
    使用split方法把字符串分割为字符数组。
  • String.prototype.replace(str/reg, str)
    用于替换字符串中匹配正则表达式或字符串的文本。

六、常用的正则表达式记录