js中几个正则表达式相关函数使用时g标志的作用
首先,javascript中涉及到正则表达式的函数总共有6个,可分为两种:
1、第一种是作为字符串对象的方法,即以
String.fun();
形式调用,这里包括 split、search、match、replace 这四个函数。
2、第二种是作为正则表达式对象的方法,即以
RegExp.fun();
形式调用,这里包括 exec、test 这两个函数。
我们知道,正则表达式从结构上划分的话可以简单的划分为三部分:分隔符、表达式 和 标志符。
如正则表达式
/^abc$/is
中,前后两个斜杠就是分隔符,分隔符中间的内容为表达式,第二个分隔符后的is就是标志符。
本文重点讨论g标志符在js的几个正则表达式相关函数中的作用。g标志符是正则表达式标志符中点击率较高的一个标志符,其作用为让该正则表达式进行全局匹配。
什么时候该进行全局匹配,什么时候不该进行全局匹配,哪些函数支持全局匹配标志g,哪些函数又不支持?手册上没有清楚的讲述这些琐碎的知识点,那就动手写测试代码,让程序说话。
1)split:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // split 函数
var a = str.split(p);
console.log(a); // ['','c','c','c']
console.log(p.lastIndex); //
var ag = str.split(pg);
console.log(ag); // ['','c','c','c']
console.log(pg.lastIndex); //
</script>
可以看到使用g标志和不使用g标志的结果一模一样,所以可以认为g标志在split函数中是无意义的。
2)search:返回与正则表达式查找内容匹配的第一个子字符串的位置。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // search 函数
a = str.search(p);
console.log(a); // 0,'ab'字符串第一次出现的位置
console.log(p.lastIndex); //
ag = str.search(pg);
console.log(ag); // 0,'ab'字符串第一次出现的位置
console.log(pg.lastIndex); //
</script>
可以看到使用g标志和不使用g标志的结果一模一样,所以可以认为g标志在search函数中是无意义的。
3)match:使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // match 函数
a = str.match(p);
console.log(a); // ['ab'],如果没有设置全局标志g,数组的0元素包含整个匹配,而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。
console.log(p.lastIndex); //
ag = str.match(pg);
console.log(ag); // ["ab", "ab", "ab"],这块手册上说的很清楚,当正则含有g标志时,全局查找,结果数组的元素0到n中包含所有匹配。
console.log(pg.lastIndex); //
</script>
可以看到对于match函数,使用g标志和不使用g标志差别很大。好在手册中对其说明也比较详细。
4)replace:返回根据正则表达式进行文字替换后的字符串的复制。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // replace 函数
a = str.replace(p,'#');
console.log(a); // #cabcabc
console.log(p.lastIndex); //
ag = str.replace(pg,'#');
console.log(ag); // #c#c#c
console.log(pg.lastIndex); //
</script>
可以看到有g标志跟没g标志的结果完全不同,没有g标志的情况下只替换第一个匹配项。
5)exec:用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // exec 函数
a = p.exec(str);
console.log(a); // ['ab']
console.log(p.lastIndex); //
ag = pg.exec(str);
console.log(ag); // ['ab']
console.log(pg.lastIndex); //
</script>
exec函数手册上也说的很清楚,如果为正则表达式设置了全局标志,exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志,exec 忽略 lastIndex 的值,从字符串的起始位置开始搜索。每次查找返回一个数组,数组元素除了0,1,2 ...外还包含3个属性 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。
6)test:返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。
<script>
var p = /ab/,
pg = /ab/g,
str = 'abcabcabc'; // test 函数
a = p.test(str);
console.log(a); // true
console.log(p.lastIndex); //
ag = pg.test(str);
console.log(ag); // true
console.log(pg.lastIndex); //
</script>
test函数在有g标志时查找从正则表达式对象的lastIndex属性值(此例中该处为0)开始查找,找到一个匹配的串以后更新lastIndex属性值,如果查找完整个串都没找到匹配项,设置lastIndex属性值为0。
综上,可以看出,六个函数中只有split和search使用或者不使用g标志结果都一样。而其他四个函数都有影响,其中test函数影响最小,只是影响lastIndex属性的值,但这点正好会导致一些很难察觉的问题,比如
<script>
var pg = /ab/g,
str = 'abc'; a = pg.test(str);
console.log(a); // true
a = pg.test(str);
console.log(a); // false </script>
同样的代码第一次结果为true,第二次结果为false,原因就是g标志改变了lastIndesx属性的值,而带g标志的test查找时又依靠lastIndex。
好了,就这些了,有总结的不对的地方,还请指正。
js中几个正则表达式相关函数使用时g标志的作用的更多相关文章
- js封装的三级联动菜单(使用时只需要一行js代码)
前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...
- [JavaScript] js中全局标识正则表达式的lastIndex属性
在JavaScript中使用正则表达式时,遇到一个坑:第一次匹配是true,第二次匹配是false. 因为在带全局标识"g"的正则表达式对象中,才有“lastIndex” 属性,该 ...
- js中常用的正则表达式
我一般对正则的使用方式如下,该方法会返回一个boolean值,然后对这个返回值来进行判断 // 判断是否是整数 function isInt(num) { var reg = new RegExp(& ...
- js中字符串支持正则表达式的方法
设一个字符串var myName = "fangming";则支持正则表达式的方法有:split(分割),replace(替换),search(查找),match(元素参数的数组) ...
- js 中常用的正则表达式
主要有以下几种: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了哦 获取日期正则表达式:\d{4}[年|\-|\.]\d{1,2}[ ...
- js中常用的正则表达式总结
去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...
- RegExp正则表达式(三)–js中正则表达式的定义
在js中,RegExp正则表达式的定义有两种方式:一种是普通方式,另一种是构造函数方式.无论是那种定义正则表达式的方式,它们都会返回RegExp对象. 普通方式定义正则表达式的格式 语法: var 变 ...
- 二、js中基础知识
该篇文章主要是强化一下自己javaScript的基础,让写代码变得更轻松些.基础好的请忽略. JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解 ...
- 小结JS中的OOP(中)
此篇文章主要是提炼<JavaScript高级程序设计>中第六章的一些内容. 一:JS中OOP相关的概念 开始之前先总结JS中OOP相关的一些概念: 构造函数:JS中的构造函数就是普通的函数 ...
随机推荐
- 如何快速重置OUTLOOK2013,2016到初始配置状态,outlook 修改数据文件位置
适用范围: 安装OUTLOOK的机器 知识点分析: 快速清除当前OUTLOOK所有账户,回归到初始配置状态. 操作步骤: WIN+R调出运行 输入: C:\Program Files (x86)\Mi ...
- 戏说PHP的嵌套函数
PHP很早就支持嵌套函数了.并是不PHP5.3有闭包时才有的.然而,它却不是象JS,AS那样的闭包嵌套.即它的嵌套函数根本无闭包模式的逃脱. PHP嵌套函数有一些特别之处.最特别的是,当外部函数被调用 ...
- 浅谈.NET中闭包
什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...
- Object:
所有类的直接或者间接父类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能. 具体方法: 1,bool ...
- 用MSBuild和Jenkins搭建持续集成环境(2)
http://www.infoq.com/cn/articles/MSBuild-2 作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意: ...
- mongodb修改器
mongodb修改器 转载自:http://blog.csdn.net/mcpang/article/details/7752736 mongodb修改器(\(inc/\)set/\(unset/\) ...
- 动态生成C# Lambda表达式
转载:http://www.educity.cn/develop/1407905.html,并整理! 对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为 ...
- 如何用myeclispe远程调试tomcat
如何用myeclispe远程调试tomcat 在工作开发中,通常用本机进行代码编写,然后将编好的工程部署到测试服务器进行测试.往往测试服务器并不是自己的本机,因此对调试带来众多不便.今天学习可以用my ...
- Using sql azure for Elmah
The MSDN docs contain the list of T-SQL that is either partially supported or not supported. For ex ...
- 博文&零散信息阅读
关于培养方案: 全国一线高校.网易云课堂和我院培养计划的区别主要体现在: 基础课上,我院删去了物理课程的必修要求. 专业课上,删去了汇编语言.编译原理.信息安全技术等学科的必修要求. 专业选修课上,我 ...