JS正则学习笔记|8月更文挑战

231 阅读4分钟

js正则学习笔记: 上个星期看了一本小书--《JavaScript 正则表达式迷你书》,我觉得写的非常好。“正则表达式是匹配模式,要么匹配字符,要么匹配位置。这是里的一句话,我觉得你体会到这句话了,那么正则就一般够用了。

正则入门的基础

首先先了解一下什么是正则?

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

字符

普通字符就没啥好说的了,下面我们来列举一下常见的元字符:

字符含义
位置相关
匹配输入字符串的开始位置。如果设置多行匹配,^ 也匹配 '\n' 或 '\r' 之后的位置
$匹配输入字符串的结束位置。如果设置多行匹配,$ 也匹配 '\n' 或 '\r' 之前的位置
\b匹配一个单词边界,也就是指单词和空格间的位置。\w([A-Za-z0-9_]) 与 \W([^A-Za-z0-9_]) 之间的位置,也包括 \w([A-Za-z0-9_]) 与 ^(开头) 之间的位置,和 \w([A-Za-z0-9_]) 与 $(结尾) 之间的位置
\B匹配一个非单词边界,就是与\b相反的
?=pattern匹配目标字符的左边的位置(个人理解)
?<=pattern匹配目标字符的右边的位置(个人理解)
?!pattern匹配目标字符的非左边的所有位置(个人理解)
?<!pattern匹配目标字符的非右边的所有位置(个人理解)
字符相关
[123]匹配 "1"、"2"、"3"、其中任何一个字符
[a-z]匹配 "a"、"b"、... "z"、字母其中任何一个字符
[^a-z]匹配不在 "a"、"b"、... "z"、中的字符
a | b匹配"a"或"b"中的一个
\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]
.通配符,匹配除了少数字符(\n、\r)之外的任意字符。
量词相关注:不带?的为贪婪模式,一般默认会匹配最大的(即m),带?的为惰性模式,默认匹配最小的(即n)。eg:{n,m}?
{n,m}连续出现 n 到 m 次
{n,}至少连续出现 n 次
{n}连续出现 n 次
?匹配前面的子表达式零次或一次,等价于 {0,1}
*匹配前面的子表达式零次或多次,等价于 {0,}
+匹配前面的子表达式一次或多次,等价于 {1,}
等等 . . .

修饰符

就是正则表达式后面跟的应该描述字母。eg:/\d/g

常用的四种修饰符:

修饰符说明
g (global)全局匹配,找到所有满足匹配的子串
m (multi line)多行匹配,把 ^ 和 $ 变成行开头和行结尾
i (ignore)匹配过程中,不区分大小写,即a===A
s默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n

方法

涉及到正则的方法主要是string和RegExp,有以下六种:

方法说明
string相关
search返回正则匹配到的第一个子串在目标字符串中的下标位置(底层会将字符串参数转换为正则)。eg:str.search(regexp)
match对目标字符串执行正则匹配操作,返回的匹配结果数组(没找到返回null)中包含具体的匹配信息(底层会将字符串参数转换为正则)。eg:string.match(reg)
split以正则匹配到的子串,对目标字符串进行切分。返回一个数组。eg:"2021-8-2".split(/\D/) // 输出['2021','8','2']
replace对目标字符串进行替换操作。正则是其第一个参数。返回替换后的字符串。eg:str.replace(reg, ',')
RegExp相关
test判断目标字符串中是否有满足正则匹配的子串。返回布尔值。eg:(/\d/).test("12345")
exec比 match 更强大的正则匹配操作。返回结果与 match 一致。eg:(/\d/).exec("12345")

正则基础到这里就差不多了,下面开始正题了熬。


匹配字符

匹配字符的话,我觉得分精准匹配和模糊匹配,精准匹配的意义不大,一般用的都是模糊匹配,模糊匹配分横向模糊匹配(利用量词)和纵向模糊匹配(利用字符组)

精准匹配

就是匹配的字符,你很精确的知道有什么

eg: 匹配 'test'
let reg = /test/
let str = 'test reg'
let result = reg.test(str)
console.log(result)   // 输出true

如果你还想更精准的匹配'test'
let reg = /^test&/
let str = 'test reg'
let result = reg.test(str)
console.log(result)   // 输出true

模糊匹配

模糊匹配的话,你看你只是知道的应该大概,大概是多长,大概是由什么字母组成

横向模糊匹配

其实就是你知道有什么字母,只是不知道有多长,配合量词相关的字符匹配出来

eg: 匹配字母abc,出现1到三个
let reg = /(abc){1,3}/g
let str = 'abc abcabc abcabcabc'
let result = str.match(reg)
console.log(result)   // ["abc", "abcabc", "abcabcabc"]

纵向模糊匹配

其实就是你知道有什么字母,只是你知道的字母是个大概,你不知道具体是什么,配合字符相关的字符匹配出来

eg: 匹配字母a或b或c和d,即是ad,bd,cd其中一个
let reg = /[abc]d/
// 这样写也可以, let reg = /(a|b|c)d/
let str = 'ad'
let result = reg.test(str)
console.log(result)   // 输出true

匹配位置

匹配位置的话就得用上面罗列的位置相关的字符,我目前了解的有^、$、\b、\B

匹配开头和结尾:
console.log("[JavaScript高级程序设计]".replace(/^\[(.+)]$/, "《$1》"));
// 输出《JavaScript高级程序设计》

匹配单词边界:\b
console.log('JavaScript'.replace(/\b/g, '-')) 
// 输出 -JavaScript-

匹配非单词边界:\B
console.log('JavaScript'.replace(/\B/g, '-')) 
// 输出 J-a-v-a-S-c-r-i-p-t

正则基础入门大概就是这样,有时间的时候我会尝试这些一些复杂的正则补充在后面。

文章参考:

菜鸟教程

《JavaScript 正则表达式迷你书》