前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【正则】956- 正则表达式有几种位置匹配模式?

【正则】956- 正则表达式有几种位置匹配模式?

作者头像
pingan8787
发布2021-05-14 15:47:04
1.3K0
发布2021-05-14 15:47:04
举报
文章被收录于专栏:前端自习课前端自习课

最近再一次重温老姚大佬的《JavaScript 正则表达式迷你书》 , 并将核心知识点整理一遍,方便复习。

原书写得非常棒,建议看下原书啦。 地址:https://github.com/qdlaoyao/js-regex-mini-book

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

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

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

代码语言:javascript
复制
/^^hello$$/.test('hello');  // true
/^^^hello$$/.test('hello'); // true

1. ^ 和 $

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

代码语言:javascript
复制
"hello".replace(/^|$/g, "#"); // "#hello#"
"hello\nleo\nhaha".replace(/^|$/gm, "#");
/*
#hello#
#leo#
#haha#
*/

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

2. \b\B

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

代码语言:javascript
复制
"[HI] Leo_1.mp4".replace(/\b/g,"#");
// "[#HI#] #Leo_1#.#mp4#"

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

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

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

代码语言:javascript
复制
"hello".replace(/(?=l)/g, "#");
// "he#l#lo"

"hello".replace(/(?!l)/g, "#");
// "#h#ell#o#"

4. 相关案例

  • 匹配数字千位分隔符
代码语言:javascript
复制
// 匹配最后一个逗号
"12345678".replace(/(?=\d{3}$)/g, ","); // "12345,678"

// 匹配所有逗号
"12345678".replace(/(?=(\d{3})+$)/g, ","); // "12,345,678"

// 匹配其余
"123456789".replace(/(?=(\d{3})+$)/g, ","); // ",123,456,789"

// 修改
"123456789".replace(/(?!^)(?=(\d{3})+$)/g, ","); // "12,345,678"

// 其他形式
"12345678 123456789".replace(/(?!\b)(?=(\d{3})+\b)/g, ","); 
// (?!\b) 等于 \B ,要求当前是一个位置,但不是 \b 前面的位置
// "12,345,678 123,456,789"
  • 数据格式化
代码语言:javascript
复制
let num = 1888;
num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/,"$$ ");
// "$ 1,888.00"
  • 验证密码
代码语言:javascript
复制
// 密码长度 6-12 位数字或字母
let r = /^[0-9A-Za-z]{6,12}$/;

// 必须包含一个字符(数字) + 密码长度 6-12 位数字或字母
let r = /(?=.*[0-9])^[0-9A-Za-z]{6,12}$/;

// 必须包含两个个字符(数字和小写字符)  + 密码长度 6-12 位数字或字母
let r = /(?=.*[0-9])(?=.*[a-z])^[0-9A-Za-z]{6,12}$/;

r.test("aa1234566"); // true
r.test("1234566");   // false


// 密码长度 6-12 位数字或字母 
// 即 不能全是数字 或 不能全是大写或小写字母
let r = /(?!^[0-9]{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[0-9A-Za-z]{6,12}$/;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自习课 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. ^ 和 $
  • 2. \b 和 \B
  • 3. (?=p) 和 (?!p)
  • 4. 相关案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档