正则表达式

请注意,本文最近一次更新于:2023-07-22,文章内容可能已经不具有时效性,请谨慎参考

本文最后更新于:2023年7月22日星期六晚上8点27分 +08:00

正则表达式基础


Statement

The author USTC-elbitsiserri has no full ownership to the content of this article.
This article is a reorganized and recreated work based on the original resources shared by ych! from the community csdn
It is hereby declared and disclaimed

正则表达式

一图速览本文核心内容

元字符表单

  1. 所有大写和小写字母、所有数字、所有标点符号和一些其他符号等没有特殊定义的标点符号都是普通字符
  2. 元字符查找的是单个字符,匹配多个时需要添加量词
  3. 对于需要匹配元字符本身时,需要进行转义
元字符 含义描述
. 查找除了换行和结束符以外的所有字符
\ 将下一个字符标记为一个特殊字符,或一个原义字符,或一个引用
/ 正则边界符
^n 边界符,匹配任何开头为n的字符串,或者表示的含义
n$ 匹配任何结尾为n的字符串
\w 查找字母、数字、下划线
\W 查找除了字母、数字、下划线的非单词字符
\d 查找数字
\D 查找非数字字符
\s 查找空白字符
\S 查找非空白字符
\n 查找换行符
\r 查找回车符
量词 表示需要匹配的数量个数
? 表示量词或禁止贪婪
[] 原子表
() 原子组
断言匹配 相当于匹配条件

量词表单

  1. 量词仅作用于它前面紧跟的字符或组
量词 含义描述
n+ 匹配任何包含至少一个n的字符串
n* 匹配任何包含零个或多个n的字符串
n? 匹配任何包含零个或一个n的字符串
n{X} 匹配包含X个n的序列的字符串
n{X,Y} 匹配包含X至Y个n的序列的字符串
n{X,} 匹配包含至少X个n的序列的字符串

模式修正符

  1. 模式修正符的作用是改变运行方式
  2. 模式可以组合使用,并且不区分先后顺序
模式 含义描述
i 不区分大小写
g 执行全局匹配(意思是查找所有匹配,而非在找到第一个匹配项后就停止。只匹配一个称为不贪婪)
m 执行多匹配模式,使边界字符^和$匹配每一行的开头和结尾

原子表

  1. 将中括号[]称为原子表,也称为字符簇,表示里面的内容可选。没有中括号就表示完全匹配
  2. 中括号内用连字符号-可以表示一个字符的范围
  3. 正则表达式中的大多特殊符号,如果被包含于中括号中,则失去特殊意义,只表示字符本意,但\ [] : ^ - 除外
  4. ^在原子表中表示取反,例如[ ^\d ]表示除了数字,但在原子表外就仍然表示开头
表达式 含义描述
[0-9] 查找任何从0到9的数字
[a-z] 查找任何从a-z的字符
[abcd] 查找给定集合内的任何字符
[^abcd] 查找给定集合外的任何字符

原子组

正则表达式中以一对括号()包裹的运算内容称为原子组,但也有的()不是原子组的情况

  1. 用处
    1
    2
    3
    4
    5
    6
    7
    8
    const str = '
    <h1>abcd</h1> //标签完整
    <h2>efgh</h2>
    <h3>ijkl</h4> //标签不完整
    ';

    str.match(/(<h[1-6]>).</\1>/g) //原子组
    str.match(/<h[1-6].</h[1-6]>/g) //原子表
    上述内容想要匹配完整的h标签,就需要使用原子组,而原子表会把不完整的标签也匹配出来
  2. 原子组的引用
  • 正则表达式中使用 \ 后面加数字n表示与第n个原子组一致 \1 \2 \3 ,依次从左往右数括号数量即可
  • 在replace替换方法中直接使用$符号完成引用,$后面加数字n表示第n个原子组,$n表示匹配到的第n个原子组的内容
  • 在replace回调函数中,第一个参数是匹配到的整体剩余参数是原子组的组合,args[0]:匹配到的第一个原子组的内容
    1
    2
    3
    4
    5
    6
    7
    8
    const reg1 = /<(h[1-6])>(.*)<\/\1>/ig;
    console.log(str.replace(reg1,'$2'))
    str.replace(reg,(v,...args)=>{
    console.log(v)
    console.log(args);;
    // v 即是正则匹配到的整体
    // args是原子组的组合
    })
  1. 原子组的别名
    当觉得$1,$2不够清晰明了时,可以为原子组起别名
    起名:(?<自定义名称>)
    使用:$<自定义名称>
    1
    2
    const reg2 = /<(h[1-6])>(?<two>.*)<\/\1>/ig;
    console.log(str.replace(reg2,'$<two>'));

    贪婪和禁止贪婪

    ?表示0个或1个,表示可选;除此之外,?还有禁止贪婪的作用
  • 当?前面是量词时,例如+*{},表示禁止贪婪
    1
    2
    3
    4
    5
    6
    // 量词加?表示禁止贪婪,往最少的一个方向去
    const str = 'hddddd';
    console.log(str.match(/hd+/))
    console.log(str.match(/hd+?/));
    console.log(str.match(/hd*?/));
    console.log(str.match(/hd{2,}?/));
  • 当?前面时除了量词以外的普通字符、原子表或者原子组,表示前面内容可选

断言匹配

  • 断言就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串
  • 断言匹配的()不是原子组,不会出现在匹配结果中
断言 含义描述
?=n 匹配任何后面紧跟指定字符串n的字符串
?!n 匹配任何后面没有紧跟指定字符串n的字符串
?<=n 匹配任何前面紧跟指定字符串n的字符串
?<!n 匹配任何前面没有紧跟指定字符串n的字符串

比如电话号码的模糊匹配问题

1
2
3
4
5
const tel = '16378303453'
const reg = /(?<=\d{7})\d{4}/
console.log(tel.replace(reg,(v)=>{
return "*".repeat(4)
}))

正则对象属性lastIndex

  • lastIndex:一个整数,表示开始下一次匹配的字符位置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 因为exec实际上是一个迭代器,正则有一个lastindex的属性,
    // 正则匹配检索到一个之后会暂停,从检索的位置再搜索,lastindex会变化,最后找不到的时候,lastindex为0
    // 统计字符出现次数
    const str = "hello,world";
    const reg = /l/g;
    let count = 0;
    console.log(reg.lastIndex);
    while(res = reg.exec(str)){
    count++;
    console.log(reg.lastIndex);
    }
    console.log(reg.lastIndex);
    console.log(count);

    正则对象的方法

    方法 含义描述
    exec 匹配字符串,返回找到的值,并确定其位置。迭代器,lastIndex
    test 在所搜索的字符串中是否存在正则表达式模式对应的匹配。返回 true 或 false。正则验证

支持正则表达式的字符串方法

方法 含义描述
match 找到一个或多个正则表达式的匹配
replace 替环正则表达式匹配的子串
split 根据正则匹配到的内容分割字符串数组
search 搜索字符串中是否存在满足正则的字串,返回索引值

$$\begin{aligned}
\mathscr{THE}\quad\mathscr{END}
\end{aligned}$$


您阅读这篇文章共花了:
Invitation
USTC-茶糜花开
FeynmanDirac
created:12/03/2022
Welcome to USTC-茶糜花开

This is an identification card as an honored membership of FeynmanDirac

Happy to see you follow FeynmanDirac, enjoy science together

© 版权声明
验证码启动中...