JavaScript——正则总结

发布时间 2023-05-29 00:00:51作者: CD、小月

@

标记

g:全局匹配,默认返回匹配到第一个目标,加上该标记,返回所有匹配项。
i :忽略大小写,匹配中忽略大小写。

元字符

元字符:正则表达式中有着特殊含义的字符

单文本匹配的元字符(单个匹配)

任意一个文本匹配的元字符(单个匹配)

. :匹配任意一个单个字符(包括.本身);大多数语言环境中,不能匹配换行符

任意一个一组字符集匹配的字符(字符集合单个匹配)

【】:匹配【】中的任意一个成员文本。
注意:在字符集中使用像.和+这样的元字符将被解释为普通字符,不需要被转义,一般加上转义,明确目的。

常用如下字符集区间(可以是一个区间也可以是多个区间):
【0-9】:0到9字符;
【A-Z】:A到Z字符;
【a-z】:a到z字符;
【A-Za-z0-9】:任意字母和数字字符;
注意:字符区间的首,尾字符可以是ASCII字符表里的任意字符。注意首尾字符大小顺序,由小到大。

取非匹配

【^】:不匹配【】中的任意一个成员文本。

匹配特殊字符的元字符(单个匹配)

转义字符

\:匹配正则表达式中的特殊字符(如:. 匹配普通.字符);
\ 字符永远出现在特殊含义的字符序列(序列可以由一个或者多个字符构成)的开头。

匹配特定的空白字符的元字符

【\b】:回退(并删除)一个字符(Backspace键)。
\f:换页符。
\n:换行符。
\r:回车符。
\t:制表符(TAB键)。
\v:垂直制表符。

匹配特定字符集的元字符(字符类)

匹配任意一个数字和非数字

\d:任何一个数字字符(等价于【0-9】)。
\D:任何一个非数字字符(等价于【^0-9】)。

匹配任意一个字母和数字(与非字母和数字)

\w:任何一个字母数字字符(大小写均可)或者下划线字符(等价于【a-zA-Z0-9_】)。
\W:任何一个非字母数字或非下划线字符(等价于【^a-zA-Z0-9_】)。

匹配任意一个空白字符(与非空白字符)

\s:任何一个空白字符(等价于【\f\n\r\t\v】)。
\S:任何一个非空白字符(等价于【^\f\n\r\t\v】)。
注意:【\b】是一个特列,没有包含在 \s 和 \S 中

匹配任意一个十六进制或八进制数值

\x:匹配一个十六进制数值。如:\x0A,对应于ASCII 字符10。
\0:匹配一个八进制数值。如:\011,对应于ASCII 字符9。

POSIX字符类

【:alnum:】:任何一个字母或数字(等价于【a-zA-Z0-9】)。
【:alpha:】:任何一个字母(等价于【a-zA-Z】)。
【:blank:】:任何一个空格或制表符(等价于【\t】)。
【:cntrl:】:ASCII控制符(ASCII0到31,再加上ASCII127)。
【:digit:】:任何一个数字(等价于【0-9】)。
【:graph:】:和[:print:]一样,但不包括空格。
【:lower:】:任何一个小写字母(等价于【a-z】)。
【:print:】:任何一个可打印字符。
【:punct:】:既不属于【:alnum:】也不属于【:cntrl:】的任何一个字符。
【:space:】:任何一个空白字符,包括空格(等价于【^\f\n\r\t\v】)。
【:upper:】:任何一个大写字母(等价于【A-Z】)。
【:xdigit:】:任何一个十六进制数字(等价于【a-fA-F0-9】)。

多个文本匹配的元字符(重复匹配)

匹配一个或多个字符

+:在一个字符(或字符集)加上+字符,匹配一个或者多个字符。至少匹配一个;

匹配零(0)个或多个字符

*:在一个字符(或字符集)加上*字符,匹配零个或者多个字符。至少匹配零个;

匹配零(0)个或一个字符

?:在一个字符(或字符集)加上?字符,匹配零个或者一个字符。最多不会超过一个字符;

匹配的重复次数(手动设定匹配次数)

{}:在一个字符(或字符集)加上{}字符,设置数值,设置匹配相应数值的字符。最多不会超过一个字符;

例子:
{3}: 设置重复次数;前面的匹配规则重复匹配三次
{3,6}:设置重复次数区间;前面的匹配规则重复匹配至少3次最多6次
{3,}:设置重复次数区间;前面的匹配规则重复匹配至少3次
{,6}:设置重复次数区间;前面的匹配规则重复匹配最多6次

防止过度匹配

在?元字符和{n}({n,m})手动设定匹配字符中,都有重复匹配次数的上限限制;
但是在其他重复匹配的语法中都没有上限限制;所以存在过度匹配(贪婪匹配)

?:添加在贪婪元字符的后面;防止过度匹配(将贪婪元字符变为惰性元字符)

常见的贪婪元字符为:* , + , {n, }
如:

* : *?
+ : +?
{n, } : {n, }?

匹配位置的元字符

位置匹配解决,在什么地方进行字符匹配

单词边界

进行与单词有关的位置匹配

\b : 匹配一个单词的开头或结尾(单词边界)
注意:\b匹配且只匹配一个位置,不匹配任何字符;如:\bcat\b只匹配到字符串cat;3个字符,而不是5个字符。

\B : 不匹配一个单词的单词边界

字符串边界

进行与字符串有关的位置匹配

^:匹配字符串开头的位置;
$:匹配字符串结尾的位置;

分行匹配模式

?m : 以行为单位进行匹配;
在分行模式中^不仅匹配正常字符串的开头,还匹配换行符(分隔符)后面开始的位置;
$不仅匹配正常字符串结尾,还将匹配换行符(分隔符)后面的结束位置。
注意:?m元字符用在整个匹配模式之前;如:(?m)^\s//.$

子表达式

类似?和{n}等重复次数的元字符只作用于紧挨着它的前面的一个字符或元字符
而通过子表达式,将使?和{n}等重复次数的元字符作用于子表达式。
子表达式是更大的表达式一部分,子表达式将被当做一个独立元素来使用。

():创建子表达式;
子表达式用和 | 元字符相配合;返回多个不同子表达式结果

注意:子表达式可以无限嵌套,但应该遵循适可而止原子

回溯引用:前后一致匹配(子表达式另一重要用途)

子表示的用途:
将一个组字符编组为一个字符集合;设定该集合重复匹配的文本以及重复次数;
另一功能为,定义回溯引用,允许表达式引用前面的匹配结果。确保前后表达式匹配一致

回溯引用指的是模式的后半部分引用在前面部分中定义的子表达式
可以将回溯引用想象成变量

\1 : 引用前面的第一个表达式;

数字需要对应相应的子表达式(不同语言环境,子表示开始计数通常为1,许多实现中,0可以代表整个正则表达式);
同一表达式可以被引用任意多次;

前后查找

通过表达式匹配文本的位置(而非文本本身),而通过该位置实现的向前或者向后查找。
注意:JavaScript不支持向后查找

向前查找

向前查找指定了一个必须匹配但不在结果中返回的模式

格式:
(实际匹配返回的文本)(?=匹配的文本模式,该文本不出现在返回的文本)

例子:
获取URL连接中的协议名
.+(?=:)

向前查找实际就是一个子表达式。
先前查找模式是以?=开头的子表达式,需要匹配的文本跟在=的后面

注意:向前查找(和向后查找)匹配本身其实是有返回结果的,只是这个结果的字符长度永远是0而已。
因为查找操作有时也被称为零宽度(zero-width)匹配操作

向后查找

格式:
(?<=匹配的文本模式,该文本不出现在返回的文本)(实际匹配返回的文本)

对前后查找取非

前后查找的目的是:指定返回的匹配文本的前后位置必须是哪些文本(匹配的文本模式);这种查找为正向前查找和正向后查找
术语"正":指的是寻找匹配的事实。
对应的有负前后查找;
负向前查找:向前查找不与给定模式匹配的文本;
负向后查找:向后查找不与给定模式匹配的文本;

负向前查找
操作符:?!

负向后查找
操作符: ?<!

嵌入条件

正则表达式里面的条件要用?来定义。

能嵌入条件时机不外乎发生以下两种情况:
根据一个回溯引用来进行条件处理。
根据一个前后查找来进行条件处理。

回溯引用条件

回溯引用条件只有在一个前面的子条件搜索取得成功的情况下才允许只用一个表达式。

格式:
(?(backer-ference)true-regex|false-regex)
(?(回溯引用)子表达式1 | 子表达式2 )
当回溯引用为真时,后面的子表达式1才会执行;当回溯引用为假时,后面的字表达2才会执行。

前后查找条件

前后查找条件只在一个向前查找或向后查找操作取得成功的情况下才允许一个表达式被使用。
定义前后查找的语法与定义一个回溯引用条件的语法大同小异,只需把回溯引用(括号里的回溯引用编号)替换为一个完整的前后查找表示式就行了

格式:
(?(?=匹配文本模式)true-regex|false-regex)
(?(?<=匹配文本模式)true-regex|false-regex)

实际工作中,嵌入了前后查找模式条件的模式相当少,特定位置的匹配往往可以通过?元字符实现。