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
正则基础入门大概就是这样,有时间的时候我会尝试这些一些复杂的正则补充在后面。
文章参考: