【20190405】JavaScript-正则式匹配与替换结果解析
在正则式的应用中有三个函数使用得最多:exec()、test()与字符串的replace(reg, options)。其中test()最简单,只要字符串与正则式可以匹配,就返回true,否则返回false。接下来主要分析一下exec()和replace()的用法。
reg.exec():
举个例子:
let reg=/-(\w)/g;
let str='the-first-index';
console.log(reg.exec(str),reg.exec(str));
这个例子取到了字符串中每个-后的字母。
首先正则式中带有g参数,说明是全局查找,那么在第一次调用exec()时会返回匹配到的第一个结果,接下来再调用exec()则会从上次查找的结果开始向后继续查找,返回第二个匹配结果。
比如在上面这个例子里,第一次调用exec()则会返回‘-f’(具体的返回值并不是字符串,下面会详细分析),这是它第一次匹配到的结果;第二次调用会返回‘-i’,这是它第二次匹配到的结果。
再看exec()返回的结果具体是怎样的:
console.log(reg.exec(str));
// 返回结果:
[ '-f',
'f',
index: 3,
input: 'the-first-index',
groups: undefined ]
可以看到是一个数组,数组的第一项是该正则式匹配到的字符串,第二项开始是从匹配字符串里取得的变量(正则式中由小括号包起来的部分会被取出),这里有多少个小括号后面就会有多少项。后面是三个特殊属性,index表示匹配到的字符串(第一个字符)在原字符串中的下标,input是输入的原字符串,groups是正则式中自定义的组。
因为返回结果是个数组,因此可以通过下标索引所需要的结果值。
str.replace(reg, options):
有了上面的铺垫,现在可以分析利用正则来替换字符串的过程了。同样用上面的例子:
let reg=/-(\w)/g;
let str='the-first-index';
console.log(str.replace(reg,function ($,$1) {
return $1.toUpperCase();
}));// theFirstIndex
这个例子把字符串转换成了小驼峰命名。
replace()函数的执行过程简单来讲就是将第二个参数结果替换第一个参数结果,返回替换后的字符串。第一个参数使用正则式的话,那么其结果就是该正则式匹配到的字符串,也就是上面讲的exec()返回的数组第一项‘-f’与‘-i’(全局搜索的情况,非全局搜索只会找到第一个匹配的字符串),而不是小括号里取到的变量。
这里的replace()中第二个参数传入了一个回调函数,这个回调函数的参数第一项是reg.exec(str)[0],也就是匹配到的字符串,第二项是reg.exec(str)[1],取到的变量,依次类推。因此例子中的返回值就是取到的变量 f 和 i 的大写形式,这里的参数名虽然没有限制,但是一般用$1表示取到的第一个变量,$2为第二个变量。。。最多可以取到$99,用$来表示匹配到的字符串。
replace()还有另外一种形式:
let reg=/-(\w)/g;
let str='the-first-index';
console.log(str.replace(reg,‘$1’);// thefirstindex
这里第二个参数直接使用了字符串形式,其中$1$2...$99代表取到的第1、2...99个变量($n只在取到了第n个变量的情况下有意义,否则没有意义,直接输出$n),注意$和$0是没有意义的。
又发现的正则的一个小坑:方括号[]
方括号在正则里代表是一个字符组,表示在一个位置里可能出现的多种字符,注意这里只匹配一个位置。
其他的用法就不写了,关键的是很多元字符在方括号里就不是元字符了,比如“.”,“$”,“?”,“*”。
let reg=/[*$?.]/g;
let str='hey*$?.';
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
//输出结果:
[ '*', index: 3, input: 'hey*$?.', groups: undefined ]
[ '$', index: 4, input: 'hey*$?.', groups: undefined ]
[ '?', index: 5, input: 'hey*$?.', groups: undefined ]
[ '.', index: 6, input: 'hey*$?.', groups: undefined ]
这些字符放方括号里是可以直接匹配的,前面不用加转义符\!
另外就是“-”只有在方括号里而且在表示范围的变量之间才是元字符,在字符组首部或者尾部都只表示一个普通字符。
let reg1 = /[-123]/
let reg2 = /[123-]/
// 在字符组首部或尾部位置,仅作为一个普通字符,而不是表示范围的连字符
reg1.test('-') // -> true
reg2.test('-') // -> true
最后字符组的范围不能乱写,值小的放前面,值大的放后面,不然会报错,因为范围字符组实际是按照字符对应的ASCII码值来确定的,例如[0-9]的码值为48~57,[a-z]的码值为97~122,[A-Z]的码值为65~90。
【20190405】JavaScript-正则式匹配与替换结果解析的更多相关文章
- JavaScript正则式入门
正则式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规 ...
- 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替
/// <summary> /// 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替换 /// </summary&g ...
- JavaScript正则式练习
使用正则式匹配第一个数字和最后一个数字,使用环视 str2 = 09051 : Fast Food Restaurants - Concession Stands/Snack Bars Delicat ...
- javascript正则——贪婪匹配
熟悉正则的朋友都知道,正则的匹配有“贪婪”和“非贪婪”之分. “贪婪”匹配是尽可能多的匹配: 对于字符串‘aaaa’, /a+/匹配整个字符串,而非贪婪匹配/a+?/匹配的是整个字符串的第一个‘a’, ...
- 我也谈javascript正则匹配
一.javascript 正则全局匹配 g 慎用test()方法 来个例子: var a = /^[a-z]+/gi; a.test('bb123'); //true a.lastIndex ; // ...
- 正则匹配与替换 regexp & regsub
正则匹配是使用正则表达式匹配字符串的一种方法:在脚本编写过程中,经常需要处理一些文本,而这些文本中可能只有部分信息是有用的,我们需要从文本中提取出这些有用信息:这时候,就需要编写特定格式的正则表达式, ...
- PHP正则匹配与替换的简单例子
PHP正则匹配与替换的简单例子,含一个匹配获取加租字体例子和一个匹配替换超链接的例子. 1.查找匹配 <b> 与 </b> 标签的内容: <?php $str = &qu ...
- mysql中的正则操作 匹配手机号,匹配中文,替换
mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...
- JavaScript正则常用知识总结
一.JavaScript正则相关方法 str.match(regexp)与regexp.exec(str)功能类似. str.search(regexp)与regexp.test(str)功能类似. ...
随机推荐
- 东软实习<3>
今天学习过程和小节 主要对多线程,单例模式以及jdbc进行了一些深入着重的学习, 还有就是学习了如何使用java操作HDFS 主要是对于一些继承调用的使用等 1.封装JDBC,自定义范型 2.反射,自 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合
这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制.虽然我们默认提供基于IL E ...
- 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等
本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...
- [Swift]LeetCode38. 报数 | Count and Say
The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 1 ...
- [Swift]LeetCode302. 包含黑色像素的最小矩形 $ Smallest Rectangle Enclosing Black Pixels
An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. The black ...
- H5与企业微信jssdk集成
H5与企业微信jssdk集成 一.公众号设置 注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单.可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没 ...
- the python challenge闯关记录(9-16)
9 第九关 是一张图,上面有很多的黑点,查看网页源代码发现了上一关的提示: 还发现了一大串的数字 感觉又是一个使用PIL库进行图像处理的题,百度后知道要将这些点连接起来并重新画图.但是不能在原始图上修 ...
- CDN边缘节点容器调度实践(上)
又拍云容器云是基于 Docker 的分布式计算资源网,节点分散在全国各地及海外,提供电信.联通.移动和多线网络,融合微服务.DevOps 理念,满足精益开发.运维一体化,大幅降低分布式计算资源构建复杂 ...
- (二)通过fork编写一个简单的并发服务器
概述 那么最简单的服务端并发处理客户端请求就是,父进程用监听套接字监听,当有连接过来时那么监听套接字就变成了已连接套接字(源和目的的IP和端口都包含了),这时候就可以和客户端通信,但此时其他客户端无法 ...
- UGUI 中Dropdown控件的使用经验
UGUI 中Dropdown控件的使用经验 在Untiy的UGUI 刚出来的时候,是没有“下拉列表”(Dropdown)控件的,这在无形中给我们的UI界面开发带来困难,不过在Untiy5.2.2之后这 ...