学习笔记-正则篇

243 阅读1分钟

主要记录一些自己容易忘记的正则字符以及方法。

一、字符

\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: 忽略大小写差异

替换操作符

image.png

方法

如果您需要知道字符串是否与正则表达式匹配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))

image.png

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})+$)/, ',')
}

参考文章

正则表达式