在正则式的应用中有三个函数使用得最多: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-正则式匹配与替换结果解析的更多相关文章

  1. JavaScript正则式入门

    正则式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规 ...

  2. 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替

    /// <summary> /// 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替换 /// </summary&g ...

  3. JavaScript正则式练习

    使用正则式匹配第一个数字和最后一个数字,使用环视 str2 = 09051 : Fast Food Restaurants - Concession Stands/Snack Bars Delicat ...

  4. javascript正则——贪婪匹配

    熟悉正则的朋友都知道,正则的匹配有“贪婪”和“非贪婪”之分. “贪婪”匹配是尽可能多的匹配: 对于字符串‘aaaa’, /a+/匹配整个字符串,而非贪婪匹配/a+?/匹配的是整个字符串的第一个‘a’, ...

  5. 我也谈javascript正则匹配

    一.javascript 正则全局匹配 g 慎用test()方法 来个例子: var a = /^[a-z]+/gi; a.test('bb123'); //true a.lastIndex ; // ...

  6. 正则匹配与替换 regexp & regsub

    正则匹配是使用正则表达式匹配字符串的一种方法:在脚本编写过程中,经常需要处理一些文本,而这些文本中可能只有部分信息是有用的,我们需要从文本中提取出这些有用信息:这时候,就需要编写特定格式的正则表达式, ...

  7. PHP正则匹配与替换的简单例子

    PHP正则匹配与替换的简单例子,含一个匹配获取加租字体例子和一个匹配替换超链接的例子. 1.查找匹配 <b> 与 </b> 标签的内容: <?php $str = &qu ...

  8. mysql中的正则操作 匹配手机号,匹配中文,替换

    mysql中的正则操作 匹配手机号,匹配中文,替换 正则匹配hy_user表内tel字段的电话号码: SELECT * FROM hy_user WHERE tel REGEXP "[1][ ...

  9. JavaScript正则常用知识总结

    一.JavaScript正则相关方法 str.match(regexp)与regexp.exec(str)功能类似. str.search(regexp)与regexp.test(str)功能类似. ...

随机推荐

  1. Python必学Django框架,入门到精通学习视频教程全都在这可以领

    “人生苦短,我用python”,学python的小伙伴应该都了解这句话的含义.但是,学python,你真正了了解强大的Django框架吗!? 据说Django还是由吉普赛的一个吉他手的名字命名的呢,有 ...

  2. [Swift]LeetCode16. 最接近的三数之和 | 3Sum Closest

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  3. [Swift]LeetCode394. 字符串解码 | Decode String

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

  4. [Swift]LeetCode423. 从英文中重建数字 | Reconstruct Original Digits from English

    Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...

  5. [Swift]LeetCode436. 寻找右区间 | Find Right Interval

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  6. 【T-SQL】系列文章全文目录(2017-06-26更新)

    本系列[T-SQL]主要是针对T-SQL的总结. SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]0 ...

  7. asp.net core 系列 15 中间件

    一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件. 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作. 请求委托用于 ...

  8. 模板模式之clone()方法

    clone()方法的使用,体现了模板模式的思想,常见用法可以参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201

  9. 程序员过关斩将--面试官再问你Http请求过程,怼回去!

    菜菜哥,X总在产品部瞎指挥,作为程序媛的我都快撑不住了 不光你撑不住了,大家都要撑不住了,外行人指导内行人,呵呵 前天我偷偷的去面试了,结果挂了 出去转转其实是好事,面试官问你什么了? 他让我描述一个 ...

  10. React Native (二) ios打包到真机

    每当在模拟器上完成了开发,都想到真机上试试,正好前段时候淘了一个imac. 这里就以打包rndemo到iphone为例,讲一下react ntive ios打包到真机的流程. 一.前置 1.有个iph ...