JavaScript 正则表达式
本文介绍 JavaScript 中正则表达式的概念、语法、正则对象的方法、字符串的正则方法,以及反向引用和正向预查的用法

# JavaScript 正则表达式

# 概念

  1. 正则表达式:Regular Expression,是由一个字符序列形成的搜索模式

  2. JavaScript 中使用 RegExp 对象表示正则表达式,其中预定义了正则相关的属性和方法

  3. JavaScript 中声明正则表达式的方式

    // 字面量声明(直接量声明)
    let reg1 = /abcde/i
    // new 声明
    let reg2 = new RegExp('abcde', 'i')
    // 正则表达式主体 abcde
    // 可选的修饰符 i
    
    

# 语法

# 修饰符

非全局匹配默认在第一个匹配后停止

修饰符 描述
i 忽略大小写
g 全局匹配
m 多行匹配

# 方括号

[A-Za-z] 可写作 [A-z]

方括号 描述
[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符
[0-9] 查找任何从 0 至 9 的数字
[a-z] 查找任何从小写 a 到小写 z 的字符,也有 [A-Z]、[A-Za-z]、[A-z]

# 元字符

元字符是正则表达式中特殊的转义字符

元字符 描述
\w 查找数字、字母及下划线,与 \W 相反
\d 查找数字,与 \D 相反
\s 查找空白字符,与 \S 相反
\b 匹配单词边界,与 \B 相反
. 查找单个字符,除了换行和回车

# 量词

正则的贪婪模式:尽量匹配更多的字符

可以在代表数量的标示符后放置?来开启非贪婪模式

量词 描述
n+ 匹配任何包含至少一个 n 的字符串
n* 匹配任何包含零个或多个 n 的字符串
n? 匹配任何包含零个或一个 n 的字符串
n{x} 匹配包含 x 个 n 的序列的字符串
n{x,} 匹配至少包含 x 个 n 的序列的字符串
n{x,y} 匹配包含 x 到 y 个 n 的序列的字符串
n$ 匹配任何结尾为 n 的字符串
^n 匹配任何开头为 n 的字符串
(?=n) 匹配任何其后紧接指定字符串 n 的字符串
(?!n) 匹配任何其后没有紧接指定字符串 n 的字符串

# 正则方法

# 正则对象方法

  1. test

    判断模式与字符串是否匹配

    const reg = /abc/;
    const res = reg.test('abcd');
    // true
    
  2. exec

    const reg = /\w/g;
    const str = 'abcd';
    const res = reg.exec('abcd');
    // 多次执行时返回:
    // a
    // b
    // c
    // d
    // null
    // a
    // ...
    

    当正则为全局匹配时,多次执行 exec 将会从前往后的返回新的匹配内容

    当正则为非全局匹配时,exec 将一直返回第一次匹配的内容

# 字符串方法

  1. search

    检索与正则表达式相匹配的子字符串,返回开头索引

    如果没有找到任何匹配的子串,则返回 -1

    const str ="abcdfg"; 
    const res = str.search(/cd/);
    // 2
    
  2. match

    检索一个或多个正则表达式的匹配

    const str ="aaabbb"; 
    const res = str.search(/a/g);
    // ['a', 'a', 'a']
    
  3. split

    在正则表达式的匹配处分割字符串

    const str = 'a-b_c';
    const res = str.split(/-|_/); // 匹配 - 或 _
    // ['a', 'b', 'c']
    
  4. replace

    替换一个或多个与正则表达式匹配的子串

    const str = '我是{{name}},正在学习{{study}}';
    const data = {name: 'Cade', study: '正则表达式'};
    str.replace(/{{(\w+)}}/g, (matched, group1, index, origin) => {
        return data[group1];
    });
    // '我是Cade,正在学习正则表达式'
    

# 反向引用

使用一对小括号包裹正则表达式的部分,称为一个分组。可以通过/加序号的方式进行引用

const reg = /(\w)\1(\w)\2/g;
const str = 'aaabbbccddd';
const res = str.match(reg);
// ['aabb', 'ccdd']

反向引用具有记忆性,对(\w)的反向引用,不仅仅要求是\w,还需要和被引用的分组匹配的内容一致

# 正向预查

使用(?=exp)表示匹配任何其后紧接指定表达式的字符串,在正则表达式中称为断言

一对小括号表示分组,又(?=exp)并不包含在匹配结果里,因此称为不捕获组

正向预查使用示例:将数字按千分制表示

// 12345678 -> 12,345,678
const str = '12345678';

// 以查找 1 到 3 位子串为准,检测其后到结束的数字个数是否为 3 的整数倍
const reg1 = /(\d{1,3})(?=(\d{3})+$)/g;
const str1 = str.replace(reg1, '$1,');

// 多次断言,以查找空位为准,用 (?!^) 去掉开头的空位
const reg2 = /(?=(\d{3})+$)(?!^)g;
const str2 = str.replace(reg1, ','); // 将空位替换为逗号
Comment here, be cool~

Copyright © 2020 CadeCode

Theme 2zh powered by VuePress

本页访问次数 0

Loading