前言
正则表达式其本身就是一种小型的,高度专业化的编程语言,能够非常方便的对字符串进行处理。
正则语法在各个语言中都是通用的,所以掌握它显得十分有必要。
创建正则
在Js
中,提供两种创建正则的方式。
字面量创建
使用//
包裹的字面量创建方式是推荐的作法,但它不能在其中使用变量。
下面尝试使用 a
变量时将不可以查询.
可以使用 eval()
转换为Js
语法来实现将变量解析到正则中,但是比较麻烦,所以有变量时建议使用下面的构造函数创建方式。
构造函数创建
使用构造函数创建对象。
当正则需要动态创建时使用这种方式。
基础语法
. 通配符
代表匹配除\n
外的任意字符。如果想匹配\n
可使用s
模式。
^ 开始符
代表必须以某个字符开始。
$ 结束符
代表必须以某个字符结束。
重复符
* 重复符
代表可以取0到无穷位 (默认贪婪取值,可通过?
取消贪婪模式)。
+ 重复符
代表可以取1到无穷位 (默认贪婪取值,可通过?
取消贪婪模式)。
? 重复符
代表可以取0到1位(默认贪婪取值,可通过?
取消贪婪模式)。
{n,m} 重复符
代表匹配n
到m
次由前面的正则表达式定义的片段(默认贪婪取值,可通过?
取消贪婪模式)。
{n} 精确重复
精确匹配n
个前面的表达式。
取消贪婪
使用?
取消贪婪。
字符集
在字符集中上面的字符均失去原本含义。只有-
^
\
可以在字符集中使用。
[] 字符集
其本身代表或的作用 [ab]
代表a
或者b
。
[-] 区间符
字符集中的 -
号代表可以取从多少到多少区间的值,ASCII
码排序,比如 [a-z 0-9 A-Z]
就是取全部的英文字母和数字。
[^] 排除符
字符集中的 ^
号代表 非 的作用。比如[^0-9]
就是说这一位数并非数字。
[\] 转义符
除开在字符集中使用还可以在外部使用,它可以使所有具有特殊意义的字符失去特殊意义。并且还可以为特定的字符指定意义。
其他的转义符会在下面介绍。这里举例只代表\
可以在字符集中使用。
\ 转义符
转义符除开在字符集中使用,也可以在外部使用。
\d | 匹配任何十进制数,它相当于在字符集中使用[0-9] |
\D | 匹配任何非十进制数,它相当于在字符集中使用[^0-9] |
\s | 匹配任何空白字符,它相当于在字符集中使用[\t\n\r\f\v] |
\S | 匹配任何非空白字符,它相当于在字符集中使用[^\t\n\r\f\v] |
\w | 匹配任何字母数字下划线字符,它相当于在字符集中使用[a-z A-Z 0-9] |
\W | 匹配任何非字母数字下划线字符,它相当于在字符集中使用[a-z A-Z 0-9] |
\b | 匹配一个特殊字符边界,比如空格 ,& .# 等(不常用) |
\A | 匹配字符串开始(不常用) |
\Z | 匹配字符串结束,如果存在换行则只匹配换行前的字符(不常用) |
\z | 匹配字符串结束(不常用) |
\G | 匹配最后匹配完成的位置(不常用) |
\n | 匹配一个换行符(不常用) |
\t | 匹配一个制表符(不常用) |
\f | 匹配一个分页符(不常用) |
| 管道符
相当于 或 请注意与字符集里的区别。|
符将前后分为两段,左右看做一个整体,而[]
中的或仅仅代表从众多选项中取出一个。
分组
() 分组符
将多个元素字符看出一个元素字符进行匹配。
分组别名
组别名使用 (?<别名>匹配规则)
形式定义。在使用match
检测时需要取消g
模式的全局匹配。
分组引用
每一个分组都有一个编号,如1,2,3,4,5。
\num
在匹配时引用原子组, $num
指在替换时使用匹配的组数据。
如下所示,将所有的
标签替换为标签,使用编号替换。
也可以使用别名替换。$<别名>
。
let new_str = str_1.replace(reg,`$
`); // 拿到content分组 console.log(new_str);
记录取消
通常情况下,我们的分组会记录编号方便后面使用。
如果一个分组的内容编号不想被记录,可使用(?:)
进行处理。
断言匹配
断言虽然写在扩号中但它不是组,所以不会在匹配结果中保存,可以将断言理解为正则中的条件。
(?=exp)
零宽先行断言 ?=exp
匹配后面为 exp
的内容。
(?<=exp)
零宽后行断言 ?<=exp
匹配前面为 exp
的内容。
(?!exp)
零宽负向先行断言 后面不能出现 exp
指定的内容。
(?
零宽负向后行断言 前面不能出现exp
指定的内容
匹配模式
正则表达式在执行时会按他们的默认执行方式进行,但有时候默认的处理方式总不能满足我们的需求,所以可以使用模式修正符更改默认方式。
修饰符 | 说明 |
---|---|
i | 不区分大小写字母的匹配 |
g | 全局搜索所有匹配内容 |
m | 视为多行 |
s | 视为单行忽略换行符,使用. 可以匹配所有字符 |
y | 从 regexp.lastIndex 开始匹配 |
u | 正确处理四个字符的 UTF-16 编码 |
i
i
模式匹配时不区分大小写。
g
g
模式不会在第一次匹配成功后就停止,而是继续向后匹配,直到匹配完成。
m
m
模式会将每一行单独匹配,用于将内容视为多行匹配,主要是对 ^
和 $
的修饰
s
s
模式将多行以一行匹配,忽略换行符\n
。这代表使用.
可匹配到任意字符。
u
每个字符都有属性,如L
属性表示是字母,P
表示标点符号,需要结合 u
模式才有效。其他属性简写可以访问
如果是一些特殊的生僻字符,那么它的字节宽度可能是4字节或更多。此时就无法正确解释出来,使用u
模式可解决该问题。
字符也有unicode
文字系统属性 Script=文字系统
,下面是使用 \p{sc=Han}
获取中文字符 han
为中文系统,其他语言请查看
lastIndex
RegExp
对象lastIndex
属性可以返回或者设置正则表达式开始匹配的位置。
必须结合
g
修饰符使用对
exec
方法有效匹配完成时,
lastIndex
会被重置为0
y
g
模式无论成功与否都会一直向后匹配,直到lastIndex
等于length
。
而y
模式也是一直向后匹配,但是只要匹配不成功就会停止。
字符串方法
以下字符串方法都可以和正则搭配使用。
search
search()
方法用于检索字符串中指定的子字符串的索引值,也可以使用正则表达式搜索,返回值为索引位置
match
match()
方法可以返回出匹配到的子字符串。
如果使用g
模式,返回的内容没那么详细了。
matchAll
match()
如果不是在g
模式下,那么只会检索一次。
而matchAll()
是全局检索,返回一个可迭代对象。
split
用于使用字符串或正则表达式分隔字符串。
如下示例,时间的分隔符不确定是那个,此时可以使用正则匹配。
replace
replace()
方法不仅可以执行基本字符替换,也可以进行正则替换,下面替换日期连接符
字符串替换
替换字符串可以插入下面的特殊变量名:
变量 | 说明 |
---|---|
$$ |
插入一个 "$"。 |
$& |
插入匹配的子串。常用 |
$` |
插入当前匹配的子串左边的内容。 |
$' |
插入当前匹配的子串右边的内容。 |
$n |
假如第一个参数是 RegExp 对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始 |
将百度一下四个文字加上链接:
百度一下,你就知道
回调函数
replace()
支持回调函数操作,用于处理复杂的替换逻辑。
变量名 | 代表的值 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2, ... | 假如replace()方法的第一个参数是一个 RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)例如,如果是用 /(\a+)(\b+)/ 这个来匹配,p1 就是匹配的 \a+ ,p2 就是匹配的 \b+ 。 |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd' ,匹配到的子字符串是 'bc' ,那么这个参数将会是 1) |
string | 被匹配的原字符串。 |
NamedCaptureGroup | 命名捕获组匹配的对象 |
使用回调函数将百度一下四个字加上链接:
百度一下,你就知道
正则方法
下面是 RegExp
正则对象提供的操作方法
test
返回布尔值,是否验证成功。
检测输入的邮箱是否合法:
exec
不使用 g
修饰符时与 match
方法使用相似,使用 g
修饰符后可以循环调用直到全部匹配完。
使用
g
修饰符多次操作时使用同一个正则,即把正则定义为变量使用使用
g
修饰符最后匹配不到时返回null
计算JavaScript
共出现了几次。
JavaScript的事件循环模型与许多其他语言不同的一个非常有趣的特性是,它永不阻塞。JavaScript非常优秀!