匹配位置
即匹配字符的两边或之间的位置(也可称为"锚")
注意:把每个位置想象成 空字符'' 更容易理解位置的概念.
开头|结尾
^: 匹配开头 $: 匹配结尾
js
// 匹配每一行开头或结尾的位置,替换成 #
// g:全局匹配 m:多行匹配
var result = "I\nlove\njavascript".replace(/^|$/gm, '#')
console.log(result)
/*
#I#
#love#
#javascript#
*/
单词边界
- \b: 匹配单词边界,
\w
与\W
之间的位置 - \B:非单词边界
js
var result = "A Lesson_01".replace(/\b/g, '#')
console.log(result)
// => "#A# #Lesson_01#"
/*
第一个#:^(开头标识)与A之间的位置
第二个#:A与空格之间的位置
第三个#:1与.(点)之间的位置
第四个#:1与$(结尾标识)之间的位置
*/
先行断言
- (?=p):匹配表达式p前面的位置
- (?!p):匹配表达式p前面之外的其他位置
js
// 匹配字母l前面的位置,
// g:全局匹配
var result = "hello".replace(/(?=l)/g, '#')
console.log(result)
// => "he#l#lo"
// 匹配除了字母l前面的位置,
// g:全局匹配
var result = "hello".replace(/(?!l)/g, '#')
console.log(result)
// => "#h#ell#o#"
后行断言
- (?<=p):匹配表达式p后面的位置
- (?<!p):匹配表达式p后面之外的其他位置
js
// 匹配字母l后面的位置,
// g:全局匹配
var result = "hello".replace(/(?<=l)/g, '#')
console.log(result)
// => "hel#l#o"
// 匹配除了字母l后面的位置,
// g:全局匹配
var result = "hello".replace(/(?<!l)/g, '#')
console.log(result)
// => "#h#e#llo#"
常见示例
格式化数字金额千位分隔
js
let result = '12345678'.replace(/(?=\d{3}$)/g, ',')
console.log(result)
// => '12345,678' 只匹配了一次(\d{3})
let result = '123456789'.replace(/(?=(\d{3})+$)/g, ',')
console.log(result)
// => ',123,456,789' 匹配至少一次(\d{3}) 【刚好为3的倍数时,开头^也匹配进去了】
let result = '123456789'.replace(/(?!^)(?=(\d{3})+$)/g, ',')
console.log(result)
// => '123,456,789' 不匹配开头
包含至少包含两种字符的密码
数字或大小写字母
js
// 匹配任意字符/位置任意个,再匹配一个数字【的前面】(该位置在^的前面)
// 匹配任意字符/位置任意个,再匹配大小写字母【的前面】(该位置在^的前面)
// 匹配 开始^
/(?=.*[0-9])(?=.*[a-zA-Z])^\w{6,12}/.test('123456') // false
/(?=.*[0-9])(?=.*[a-zA-Z])^\w{6,12}/.test('1a2345') // true
/(?=.*[0-9])(?=.*[a-zA-Z])^\w{6,12}/.test('a23456') // true