Skip to content

匹配位置

即匹配字符的两边或之间的位置(也可称为"")

注意:把每个位置想象成 空字符'' 更容易理解位置的概念.

image

开头|结尾

^: 匹配开头 $: 匹配结尾

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