主要记录一些自己容易忘记的正则字符以及方法。
一、字符
\d: 数字,也可以用[0-9] \D: 非数字,也可以用[^0-9]
\w: 字母、数字、下划线,单词字符,也可以用[a-zA-Z0-9_],w是word的简称 \W: 非单词字符
\s: 空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符,也可以用[\t\v\n\r\f],s是space的简称 \S:非空白符
.: 通配符,但是不包括换行符、回车符、行分隔符和段分割符
匹配任意字符
[\d\D] 或者 [\w\W] 或者 [\s\S] 或者[^]
二、定义
字符组
1.[0-9]: 0-9中的任意字符都可以
2.[^0-9]: 非数字字符,字符组的第一位取反符号,表示反的概念
量词
?: 等价于{0,1} +: 等价于{1,} *: 等价于{0,}
喵字符
^: 开头 ?!^: 不是开头 $: 结尾
"hello".replace(/^|$/g, '#');
// #hello#
\b: 单词边界,\w和\W之间的位置,\w和^的位置,也可以是\w和$之间的位置
"[JS] Lesson_01.mp4".replace(/\b/g, '#');
// [#JS#] #Lesson_01#.#mp4#
(?=p): p前面的字符
"hello".replace(/(?=l)/g, '#'); // he#l#l0
(?!p): (?=p)反面意思
"hello".replace(/(?!l)/g, '#') // #h#ell#o#
匹配模式
g: 全局
m: 多行
i: 忽略大小写差异
替换操作符
方法
如果您需要知道字符串是否与正则表达式匹配RegExp,请使用RegExp.test(). 如果您只想找到第一个匹配项,则可能需要 RegExp.exec()改用。 如果要获取捕获组并且设置了全局标志,则需要使用 RegExp.exec()或 String.prototype.matchAll()代替。
test方法
str.match(reg)
三种模式
1.如果 regexp 不带有 g 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 index(匹配项的位置)、input(输入字符串,等于 str):
'For more information, see Chapter 3.4.5.1'.match(/see (chapter \d+(\.\d)*)/i)
// [ 'see Chapter 3.4.5.1', // // JavaScript(完全匹配)
// 'Chapter 3.4.5.1', // Script(第一个分组)
// '.1', // Script(第二个分组,最后一次匹配)
// index: 22, // 7(匹配位置)
// input: 'For more information, see Chapter 3.4.5.1' 源字符串]
2.如果 regexp 带有 g 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息。
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.match(/[A-E]/gi)
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
"ababa abbb ababab".match(/(ab)+/g)
// ["abab", "ab", "ababab"]
3.如果没有匹配项,则无论是否带有标记 g ,都将返回 null
str.matchAll(reg)
搜索所有组的所有匹配项
与 match 相比有 3 个区别:
它返回包含匹配项的可迭代对象,而不是数组。我们可以用 Array.from 从中得到一个常规数组。
每个匹配项均以包含分组的数组形式返回(返回格式与不带 g 标记的 str.match 相同)。
如果没有结果,则返回的不是 null,而是一个空的可迭代对象。
Array.from('<h1>Hello, world!</h1>'.matchAll(/<(.*?)>/g))
str.search(reg)
查找第一个匹配上正则的位置
str.replace(reg, str|func)
func中的参数是匹配项的内容,参数顺序是str, offset input
reg.exec(str)
reg.test(str)
三、常用
数字的千位分隔符表示法
比如把"12345678",变成"12,345,678"
function toThousands(str) {
return str.replace(/(?!^)(?=(\d{3})+$)/, ',')
}
参考文章