前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谈谈正则表达式

谈谈正则表达式

作者头像
Jimmy_is_jimmy
发布2019-07-31 17:04:05
2940
发布2019-07-31 17:04:05
举报
文章被收录于专栏:call_me_Rcall_me_R

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

嗯~那就是:

  • 正则表达式描述规则
  • 正则表达式作用于字符串

本博文仅仅是自己阅读的笔记...

基础语法的东西,记住下相关的英文就比较好理解了,比如: digit指的是数字[0-9],转换为正则关键字为\d,而其大写\D则表示非digit,即非[0-9]。

^和[^regex]

^这个是放在规则的前面,表示是匹配的开头。[^regex]也就是逻辑非。

代码语言:javascript
复制
console.log((/^I am/).test('I am a teacher.')); // true
代码语言:javascript
复制
console.log((/[^\d]/).test('aa')); // true

[\b]和\b

[\b]表示的是回退符backspace;而\b表示的是单词边界border

代码语言:javascript
复制
let str = 'teacher\b';
console.log(/[\b]/.test(str)); // true
代码语言:javascript
复制
let str = 'I am a teacher.'
console.log(str.replace(/\bam\b/, 'am not')); // 'I am not a teacher'
代码语言:javascript
复制
let str = 'Mike is a teacher. And Mike love this job!'
let pattern = /\bmike\b/gi;
console.log(str.replace(pattern, 'Jay')); // 'Jay is a teacher. And Jay love this job!'

集合区间[]

集合的区间是使用中括号[]。上面说的[\b]是回退符可以特殊对待。

代码语言:javascript
复制
console.log(/[a-z]/.test('bb')); // true
console.log(/[a-z]/.test('BB')); // false

分组()

所有以()元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式

分组分类型有捕获型()非捕获型(?:)正向前瞻型(?=)反向前瞻型(?!)等。

  • 捕获型(pattern)

匹配结果会存储在缓冲区内供以后使用。

代码语言:javascript
复制
let dateStr = '2019/07/16';
let reg = /(\d{4})\/(\d{2})\/(\d{2})/;
dateStr = dateStr.replace(reg, '$1-$2-$3');
console.log(dateStr); // "2019-07-16"
  • 非捕获型(?:pattern)

pattern部分组合成一个可统一操作的组合项,但不把这部分内容作为子匹配捕获,匹配的内容部进行编号也不存储在缓冲区中供以后使用。非捕获性分组方法在必须进行组合、但又不想对组合的部分进行缓存的情况下非常有用。

例如在一篇文章中找programproject两个单词,正则表达式可以表示为/program|project/,也可以表示为/pro(gram|ject)/,但是缓存子匹配(gramject)没有意义,就可以用/pro(?:gram|ject)/进行非捕获性匹配这样既可以简洁匹配又可不缓存无实际意义的字匹配。

代码语言:javascript
复制
let dateStr = '2019/07/16';
let reg = /(?:\d{4})\/(\d{2})\/(\d{2})/;
dateStr = dateStr.replace(reg, '$1-$2-$3');
console.log(dateStr); // "07-16-$3"
console.log(RegExp.$3); // ''
  • 正向前瞻型(?=pattern)

在目标字符串的相应位置必须有pattern部分匹配的内容,但不作为匹配结果处理,更不会存储在缓冲区内供以后使用。

比较好的说明:你站在原地往前看,如果前方是指定的东西就返回true,否则为false

代码语言:javascript
复制
let str = 'I am a teacher';
let pattern = /I am a (?=teacher)/
console.log(pattern.test(str)); // true
console.log(RegExp.$1); // ''
  • 反向前瞻型(?!pattern)

比较好的说明:你站在原地往前看,如果前方不是指定的东西就返回true,否则为false

代码语言:javascript
复制
let str = 'I am a teacher';
let pattern = /I am a (?!teacher)/
console.log(pattern.test(str)); // false
console.log(RegExp.$1); // ''

引用$1,$2...

上面中分组已经说到,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 ?:, ?=, 或者 ?! 来忽略对这部分正则表达式的保存。

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式。

你可以使用$1, $2...进行逐个的匹配访问,比如:

代码语言:javascript
复制
let dateStr = '2019/07/16';
let reg = /(\d{4})\/(\d{2})\/(\d{2})/;
reg.test(dateStr);
console.log(RegExp.$1); // 2019
console.log(RegExp.$2); // 07
console.log(RegExp.$3); // 16

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ^和[^regex]
  • [\b]和\b
  • 集合区间[]
  • 分组()
  • 引用$1,$2...
  • 参考
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档