在正则式的应用中有三个函数使用得最多: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. Java (JDK 多版本切换)—— Windows平台

    0. 背景 常常在不同的应用中需要用到不同版本的Java ,需要切换不同JAVA_HOME. 1. 方法 Step 1. 安装不同版本的JDK(JRE),最好都安装在一个Java目录分支下.例如: S ...

  2. LeetCode编程训练 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  3. 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)

    散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...

  4. 实战深度学习OpenCV(一):canny边缘检测

    利用canny边缘检测,我们可以很好地得到哦一个图像的轮廓,下面是基于C++的,这是我们通过这段代码得到的结果: #include "pch.h" #include <ios ...

  5. [Swift]LeetCode86. 分隔链表 | Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  6. [Swift]LeetCode385. 迷你语法分析器 | Mini Parser

    Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...

  7. Linux 下源码编译FFMEG

    目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...

  8. 安装ubuntu18.10并连接xshell6

    emmmm万万没想到上一篇装的linux内核才3.10,装个ubuntu系统来继续自己的docker学习之旅. 话不多说,先下镜像,地址:http://mirrors.melbourne.co.uk/ ...

  9. so库链接和运行时选择哪个路径下的库?

    总结今天遇到的一个so库链接.运行问题. 这几天修改了xapian的源码,重新编译so库,再重新编译之前的demo程序,跑起来后却发现执行的函数并非我修改过的,使用的还是老版本.折腾了一会儿,发现是因 ...

  10. slf4j 和 log4j的关系及合用Maven配置

    最近因为项目实在是太忙,都没有时间学习.有时候会很矛盾,一方面是全心全意的想去快速做完项目,一方面又想学习点新东西.这样导致这两三个月都没有去学习一些新的东西,这周我开始创建自己的maven项目,因为 ...