资讯专栏INFORMATION COLUMN

看懂火星文(三) 2019.4.3更新

Charlie_Jade / 2727人阅读

摘要:则是将作为一组,表示出现多次。如果没有使用标示,则仅返回第一个完整匹配及其相关的捕获组。构造函数的全局属性到存储了分组匹配的结果。

感谢

本文参考《正则表达式迷你书》

分组和分支结构 分组

括号可以提供分组的功能。/a+/, 标示a出现多次。/(ab)+/, 则是将ab作为一组,表示ab出现多次。

分组引用

使用括号可以实现数据提取和替换操作。我们以匹配日期(yyyy-mm-dd)为例

// 无括号版本
var reg1 = /d{4}-d{2}-d{2}/

// 有括号版本
var reg2 = /(d{4})-(d{2})-(d{2})/

正则引擎在匹配的过程中,会存储每一个分组匹配到的数据

提取分组数据 match方法

match接受一个正则表达式作为参数。如果正则表达式中有g标示, 将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。如果没有使用g标示,则仅返回第一个完整匹配及其相关的捕获组。

var regex = /(d{4})-(d{2})-(d{2})/g
var string = "2017-06-12 2017-06-12"

// ["2017-06-12", "2017-06-12"]
// 返回与完整正则表达式匹配的所有结果, 不含分组的结果
string.match(regex)
var regex = /(d{4})-(d{2})-(d{2})/
var string = "2017-06-12 2017-06-12"

// 只返回第一个完整匹配和其分组
// ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12 2017-06-12", groups: undefined]
string.match(regex)
exec方法

exec方法接受一个字符串作为参数。如果exec匹配失败将会返回null, 如果匹配成功exec方法将会返回一个数组。

返回的数组将完全匹配成功的文本作为第一项,而分组匹配的结果在数组位置0的后面。返回的结果同时拥有index属性, 标示了匹配字符为于原始字符的索引。input属性则是原始的字符串。

注意当正则对象是否包含g返回结果是不一样的。如果正则中含有g标示, 那么正则对象的lastIndex(下一次匹配开始的位置), 会更新。而如果不含有g, 正则的lastIndex不会更新。

var regex = /(d{4})-(d{2})-(d{2})/
var string = "2017-06-12 2017-06-12"

// ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12 2017-06-12", groups: undefined]
// regex.lastIndex === 0
regex.exec(string)
// ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12 2017-06-12", groups: undefined]
// regex.lastIndex === 0
regex.exec(string)
var regex = /(d{4})-(d{2})-(d{2})/g
var string = "2017-06-12 2017-06-12"

// ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12 2017-06-12", groups: undefined]
regex.exec(string)
// ["2017-06-12", "2017", "06", "12", index: 11, input: "2017-06-12 2017-06-12", groups: undefined]
// regex.lastIndex === 21
regex.exec(string)
RegEx

我们也可以通过RegEx全局的构造函数来获取分组匹配的结果。构造函数的全局属性$1到$9存储了分组匹配的结果。

var regex = /(d{4})-(d{2})-(d{2})/g
var string = "2017-06-12 2017-06-12"

// 任何正则操作即可
regex.exec(string)

// "2017"
RegExp.$1
替换分组数据

我们可以通过replace方法配合分组匹配的结果, 实现替换分组数据

replace

str.replace(regexp|substr, newSubStr|func)

regexp 一个正则表达式对象,该正则所匹配的内容会被replace的第二个参数(或者函数的返回值)替换掉

substr 当str中含有substr, 会被第二个参数替换, 仅有第一个匹配项会被替换

newSubStr 用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名(见下表)

func 函数的返回值将替换掉第一个参数匹配到的结果

变量名 含义
$1, $2, $3…… 第n个分组匹配的结果
$` 插入当前匹配的子串左边的内容
$" 插入当前匹配的子串右边的内容
$& 当前匹配的子串
// "           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103163.html

相关文章

  • 持续更新免费的API,做一个API的搬运工

    摘要:为了方便广大的开发者,特此统计了网上诸多的免费,为您收集免费的接口服务,做一个的搬运工,以后会每月定时更新新的接口。将长段中文切词分开。 为了方便广大的开发者,特此统计了网上诸多的免费API,为您收集免费的接口服务,做一个api的搬运工,以后会每月定时更新新的接口。有些接口来自第三方,在第三方注册就可以成为他们的会员,免费使用他们的部分接口。 百度AccessToken:针对HTTP ...

    Shihira 评论0 收藏0
  • 【面向对象的PHP】之模式:原型

    摘要:原型模式平行的继承层次使用工厂模式在大型设计中,必须去维护大量的产品类。上文中,称之为特殊的耦合在这里我们介绍一种其抽象工厂模式的变体原型模式。面向对象设计模式目录 原型模式 平行的继承层次使用工厂模式在:大型设计中,必须去维护大量的产品类。(上文中,称之为特殊的耦合) 在这里我们介绍一种其抽象工厂模式的变体:原型模式。它使用clone关键词,来复制具体产品类,使得具体产品类能完成自我...

    Alan 评论0 收藏0
  • 读懂那些火星(正则)表达式:捕获元与非捕获元

    摘要:先看一张来自于菜鸟教程的定义四种形式,加和不加有什么区别,区别就是捕获元与非捕获元,表现形式就是用方法去匹配,捕获组会单纯保存在一组变量中。捕获元与非捕获元搞懂了,那与啥区别呢,答案,两个区别。 想读懂世间所有的那些变态正则表达式?做梦,年纪轻轻,想啥呢,尽自己最大努力学就行 引子 JS学了用了也快一两年了,对象啥的找到了也会用了,继承啥的也入门了,但看别人的框架代码,总是会随时卡壳,...

    Dr_Noooo 评论0 收藏0
  • NoSQL应用征大赛,赢取iPhone6和火星车!

    摘要:和后起之秀是文档类中的佼佼者。因为部分作者提出延期申请,且恰逢春节假期,本次举办方考虑到各方因素,特此将截稿日期延期至月号。 大数据包含大利润,对于一些数据量庞大的企业,高扩展的非关系型数据库的使用往往已经超过关系型数据库,而这种新型数据库我们称之为NoSQL。MongoDB和后起之秀SequoiaDB是文档类NoSQL中的佼佼者。 鉴于这两种数据库(MongoDB和SequoiaD...

    weij 评论0 收藏0

发表评论

0条评论

Charlie_Jade

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<