二、正则表达式位置匹配

位置匹配,就是要匹配每个字符两边的位置。

ES5 中有6个位置: ^$\b\B(?=p)(?!p)

另外把位置理解成空字符是非常有用的:

  1. /^^hello$$/.test('hello'); // true
  2. /^^^hello$$/.test('hello'); // true

1. ^ 和 $

^ 匹配开头,多行中匹配行开头。
$ 匹配结尾,多行中匹配行结尾。

  1. "hello".replace(/^|$/g, "#"); // "#hello#"
  2. "hello\nleo\nhaha".replace(/^|$/gm, "#");
  3. /*
  4. #hello#
  5. #leo#
  6. #haha#
  7. */

多行匹配模式使用 m 修饰符。

2. \b\B

\b 匹配单词边界,即 \w\W 之间的位置,包括 \w^ 之间的位置,和 \w$ 之间的位置。
\B\b 相反,即非单词边界,匹配中除去 \b,剩下的都是 \B 的。
也就是 \w\w\W\W^\W\W$ 之间的位置。。

  1. "[HI] Leo_1.mp4".replace(/\b/g,"#");
  2. // "[#HI#] #Leo_1#.#mp4#"
  3. "[HI] Leo_1.mp4".replace(/\B/g,"#");
  4. // "#[H#I]# L#e#o#_#1.m#p#4"

3. (?=p)(?!p)

p 为一个子模式,即 (?=p) 匹配前面是 p 的位置,而 (?!p) 则匹配前面不是 p 的位置。

  1. "hello".replace(/(?=l)/g, "#");
  2. // "he#l#lo"
  3. "hello".replace(/(?!l)/g, "#");
  4. // "#h#ell#o#"

4. 相关案例

  • 匹配数字千位分隔符
  1. // 匹配最后一个逗号
  2. "12345678".replace(/(?=\d{3}$)/g, ","); // "12345,678"
  3. // 匹配所有逗号
  4. "12345678".replace(/(?=(\d{3})+$)/g, ","); // "12,345,678"
  5. // 匹配其余
  6. "123456789".replace(/(?=(\d{3})+$)/g, ","); // ",123,456,789"
  7. // 修改
  8. "123456789".replace(/(?!^)(?=(\d{3})+$)/g, ","); // "12,345,678"
  9. // 其他形式
  10. "12345678 123456789".replace(/(?!\b)(?=(\d{3})+\b)/g, ",");
  11. // (?!\b) 等于 \B ,要求当前是一个位置,但不是 \b 前面的位置
  12. // "12,345,678 123,456,789"
  • 数据格式化
  1. let num = 1888;
  2. num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/,"$$ ");
  3. // "$ 1,888.00"
  • 验证密码
  1. // 密码长度 6-12 位数字或字母
  2. let r = /^[0-9A-Za-z]{6,12}$/;
  3. // 必须包含一个字符(数字) + 密码长度 6-12 位数字或字母
  4. let r = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;
  5. // 必须包含两个个字符(数字和小写字符) + 密码长度 6-12 位数字或字母
  6. let r = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;
  7. r.test("aa1234566"); // true
  8. r.test("1234566"); // false
  9. // 密码长度 6-12 位数字或字母
  10. // 即 不能全是数字 或 不能全是大写或小写字母
  11. let r = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;