JavaScript系列----正则表达式
1.正则表达式
1.1.正则表达式的类型
正则表达式在JavaScript中,提供了一种内置的构造函数--RegExp.
正则表达式有三种匹配模式:
- g: 表示全局模式,即模式应用于所有的字符串,而非发现第一个符合条件的字符串停止。
- i: 表示字符串匹配的时候忽略(ingnore)字符串的大小写。
- m: 表示多行(multiline)模式,即在达到一行的末尾时,确定是否要接着匹配下一行。
1.2.正则表达式创建
正则表达式的两种创建方式:
- 面向字面量
字面量方式创建字符串比较简单,如下所示var reg=/bt/gim; ----注释: /bt/ 两个斜杠中表示的是匹配项。而 gim表示匹配模式,g i m 三种匹配模式可以写一种或几种,也可以不写。
- 构造函数
构造函数如下所示var reg=new RegExp("bt","gim");//---注释 第一个参数是字符串匹配项,第二种表示匹配模式。
两种方式在初始化正则表达式的时候所得的结果,几乎相同。除了一点----- 第二种在出现元字符的时候需要转义.
- 面向字面量
1.3.元字符
正则表达式的元字符均需要转义:
( [ { \ ^ $ | ) ? * + .] } 这14中字符在表示的时候均与要转义,因为他们在正则表达式中均有其自己的含义。
关于正则表达式的匹配项的意义,这里只列举比较少见的几种。详情参见----正则表达式语法
- x|y ------表示匹配X或者Y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。
- (?:x|y)---表示匹配X或者Y,但是过滤掉子选择项。这两种列举出来主要是是区分和上一种的区别。
/* 第一种演示(X|Y)*/
var str = 'iam007';
var reg = /^([a-z]|\d)/; //匹配以数字或者是字母开头的字符串
var result = reg.exec(str);
console.log(result[1]); //---结果:i /*第二种 演示(?:X|Y)*/var str = 'iam007';
var reg = /^(?:[a-z]|\d)/;
var result = reg.exec(str);
console.log(result[1]); //undefined - (?=pattern)-----表示匹配从pattern开始向后搜索,并且根据pattern不占位置,并且下次匹配是从该位置开始的。
var str = 'iam007';
var reg = /(?=[a-z])(\w)/g;
var result = reg.exec(str);
while (result && result.length) {
console.log(result[1]);
result = reg.exec(str);
} //第一次匹配从i开始,第二次匹配从a开始,第三个匹配从m开始,第四次则无匹配项,输出结果 :----i a m; - (?!pattern)-----!pattern表示第一个与pattern不匹配的项,该匹配也是非捕获类型的。而且,下次匹配是从这个pattern位置开始的。
var str = 'iam007';
var reg = /(\w)(?![a-z])\d/g;
var result = reg.exec(str);
while (result && result.length) {
console.log(result[1]);
result = reg.exec(str);
} // 输出结果 ---- m 0 第一次匹配(m00),第二次匹配(007).第三次无匹配项。
2.RegExp的属性
2.1.RegExp的属性
RegExp的每个实例都有下列属性,通过这些属性可以得到正则表达式的各种信息。
- global: 布尔值,表示是否设置了g标志。----只读属性
- ignoreCase:布尔值,表示是否设置了i标志。----只读属性
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0开始。 ----可以读和写(但有局限性)
- multiline:布尔值,表示是否设置了m标志。-----只读属性
- source:正则表达式的字符串表示。 -----只读属性
这些属性,虽然包含在模式生命中,但是没有很大的作用,除了lastIndex外(只在global=true时更改才有效,当global=false时,即使更改,也是从index=0位置处开始搜索),其余的都不可更改,下面我们举个例子来说明lastIndex的用处。
var reg = /\w/g;
var str = 'abcdefg';
var result = reg.exec(str);
while (result && result.length) {
console.log(result[0]);
reg.lastIndex=reg.lastIndex+1;
result = reg.exec(str);
}//跳跃查询,实用处也不大。
2.2.RegExp构造函数属性
RegExp构造函数有一些属性,请同RegExp实例的属性进行比较,讲着两部分主要是为了引出下一小节的内容。
长属性名 短属性名 说明 input $_ 最近一次要匹配的字符串 lastMatch $& 最近一次匹配项(opera未实现此属性) leftContext $` input字符串被匹配项之前的文本 multiline $* 是否所有表达式都使用多行模式。IE和Opera尚未实现 rightContext $' input字符串被匹配项之后的文本 lastParen $+ 最近一次的捕获组.Opera未实现 补充属性: $+数字,表示被小括号捕获的项。
这些值,可以从exec()和test()中提取出具体信息。----注:此正则表达式实例必须是字面量形式创建,才可以访问。
var text = 'hello world';
var reg = /\s/g; //匹配中间的空格
var result = reg.exec(text);
for (var property in RegExp) {
console.log('RegExp[' + property + ']=' + RegExp[property]);
}
//输出结果RegExp[input]=hello worldRegExp[multiline]=falseRegExp[lastMatch]=RegExp[lastParen]=RegExp[leftContext]=helloRegExp[rightContext]=worldRegExp[$1]=RegExp[$2]=RegExp[$3]=RegExp[$4]=RegExp[$5]=RegExp[$6]=RegExp[$7]=RegExp[$8]=RegExp[$9]=
2.3.正则表达式的使用
先来看一段代码比较:
var text = 'hello2world';
var reg = /\d/g;
var result = reg.exec(text);
console.log(RegExp.lastMatch);
reg=new RegExp("\\w","g");result = reg.exec(text);
console.log(RegExp.lastMatch);//输出结果 2 h由以上的输出结果,我们知道,所有的正则表达式实例在使用的时候都会改变RegExp构造函数的属性, 所以在每一次正则表达式使用的时候我们都可以通过RegExp构造函数的属性,来取得我们想要的结果。
3.正则表达式exec(),test()以及match()方法及其区别。
3.1.非全局模式---global=false;
exec()函数:
exec() 方法用于检索字符串中的正则表达式的匹配,返回值是数组
语法:RegExpObject.exec(string)
参数 描述 返回值 string 被检索的字符串 字符串数组 在非全局模式下,每次检索字符串的时候都是从最开始的位置检索,返回的数组,第一项是完全匹配的项,第二项是捕获项!等于RegExp.$1,同时也改变RegExp构造函数的属性。
var text = 'hello2world2sad';
var reg = /\w*(\d)\w/;
var result = reg.exec(text); console.log(result[0]);//hello2world2s 贪婪匹配
console.log(result[1]);// result = reg.exec(text); console.log(result[0]); // hello2world2s
console.log(result[1]);// console.log(RegExp.$1) //test()函数:
test() 方法用于检查字符串中是否与正则表达式匹配,返回值是布尔值。
语法:
RegExpObject.test(string)
参数 描述 返回值 string 被检索的字符串 布尔值 在非全局模式下,每次检索字符串的时候都是从最开始的位置检索,返回 true|false,同时也改变RegExp构造函数的属性。
var text = 'hello2world';
var reg = /\w*(\d)\w/;
var result = reg.test(text);
console.log(result); //true
result = reg.test(text);
console.log(result); //true
console.log(RegExp.$1) //match()函数
match() 方法用于检查字符串中是否与正则表达式匹配,返回值是数组。
stringObject.match(searchvalue)
stringObject.match(regexp)语法:
参数 描述 返回值 seachValue 字符串 数组 参数 描述 返回值 regexp 正则表达式 数组 在非全局模式下,每次检索字符串的时候都是从最开始的位置检索,返回的是一次检索结果后的数组,同时也改变RegExp构造函数的属性。
var text = 'hello2world2sad';
var reg = /\w*(\d)\w/;
var result = text.match(reg);
console.log(result[0]); //hello2world2s
console.log(result[1]); //2
result = text.match(reg);
console.log(result[0]); // hello2world2s
console.log(result[1]); //2
3.1总结:在非全局模式下:
test()方法: 返回的总是布尔值,每次均从字符串首位开始检索字符串。
exec()方法: 返回值是数组,数组中保存的总是第一次的匹配结果,每次检索均是从字符串首位开始检索。
match()方法:返回值是数组,数组中保存的一次的匹配结果,每次检索均是从字符串首位开始检索,返回结果和exec()的结果总是一致的。
在非全局模式下,exec()和match()唯一的区别就是调用者和函数参数位置互换而已。
3.2.全局模式下---global=true
exec()函数:
在全局模式下,每次检索字符串的时候都是从字符串上一次检索的结束位置开始检索,每次返回的数组,第一项是完全匹配的项,第二项是捕获项!等于RegExp.$1,同时也改变RegExp构造函数的属性。
代码如下:
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g;
var result = reg.exec(text);
console.log(result); //["hello1", "1"]
result = reg.exec(text);
console.log(result); //["hello2", "2"]所以,可以利用这种特性用正则表达式,遍历检索字符串。
test()函数:
在非全局模式下,每次检索字符串的时候都是从上一次检索后的位置开始检索,返回 true|false,每次检索都会改变RegExp构造函数的属性。
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g;
var result = reg.test(text);
while (result) {
console.log(RegExp.$1); //1 2 3 4 5
result = reg.test(text);
}match()函数
match函数在全局模式下,和非全局模式下有很大的区别。其在全局模式下,一次检索后,返回的虽然是个数组。但是数组中保存的所有匹配正则表达式的项。 如下所示:
3.2总结:在全局模式下:
test()方法: 返回的总是布尔值,每次均是从上一次检索后的位置开始检索字符串。
exec()方法: 返回值是数组,数组中保存的是每一次的匹配结果,每次均是从上一次检索后的位置开始检索字符串。
match()方法:返回值是数组,数组中保存的是所有的匹配结果,一次检索后,字符串会被检测完。下次在检索的时候,总是从字符串开头开始检索,两次返回的结果总是相同的。
在全局模式下,exec()和test()每次检索都是从上一次检索后的位置开始向后检索。而match()总是将所有匹配的结果保存在数组中。
4.字符串常用的正则表达式函数
4.1. split()函数
split()函数的参数可以是字符串也可以是正则表达式。返回的结果总是数组
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /\d/g;
var result = text.split(reg); console.log(result); //hello ,hello ,hello, hello, hello4.2. repalce()函数
replace()函数的参数可以是字符串也可以是正则表达式,当其为正则表达式的时候,使用如下
var reg = /(^\s*|\s*$)/g //去掉字符串的开头和结尾空格
var hello = ' dasdasd ';
console.log(hello.replace(reg, '').length);var reg = /(\w)/g //将字符串中小写换成大写
var hello = 'dasdasd';
console.log(hello.replace(reg, function () {
return RegExp.$1.toUpperCase()
})); //DASDASD
JavaScript系列----正则表达式的更多相关文章
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...
- JavaScript 系列--JavaScript一些奇淫技巧的实现方法(二)数字格式化 1234567890转1,234,567,890;argruments 对象(类数组)转换成数组
一.前言 之前写了一篇文章:JavaScript 系列--JavaScript一些奇淫技巧的实现方法(一)简短的sleep函数,获取时间戳 https://www.mwcxs.top/page/746 ...
- 详解Javascript中正则表达式的使用
正则表达式用来处理字符串特别好用,在JavaScript中能用到正则表达式的地方有很多,本文对正则表达式基础知识和Javascript中正则表达式的使用做一个总结. 第一部分简单列举了正则表达式在Ja ...
- 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目
博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...
- 深入理解javascript系列(4):立即调用的函数表达式
本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...
- javascript类型系统——正则表达式RegExp类型
× 目录 [1]对象 [2]实例属性 [3]静态属性[4]实例方法 前面的话 前面已经介绍过javascript中正则表达式的基础语法.javascript的RegExp类表示正则表达式,String ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- javascript中正则表达式的基础语法
× 目录 [1]定义 [2]特点 [3]元字符[4]转义字符[5]字符组[6]量词[7]括号[8]选择[9]断言[10]模式[11]优先级[12]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...
随机推荐
- Python协程爬取妹子图(内有福利,你懂得~)
项目说明: 1.项目介绍 本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...
- 浅谈Spring的AOP实现-动态代理
说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...
- Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...
- ZOJ1171
错误代码先放这 #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring& ...
- Sqlserver数据库 通过表触发器 实时通知应用程序
/* Sqlserver数据库开始相关服务 以下示例显示了如何查看 OLE Automation Procedures 的当前设置.0未启用 */ EXEC sp_configure 'show ad ...
- WCF的客户端与服务端
服务端 : 1.新增一个Winform的服务端 2.选择以上建的项目,增加一个WCF服务 3.定义三个方法,一个不返回结果不带参数.返回结果带参数.返回结果以类的方式传递参数 4.Service1继承 ...
- iOS音频格式PCM转G711u(或G711a-law)
请尊重作者劳动成果,如需转载本博客文章请注明出处!谢谢合作! inputData是PCM的实时数据,可以通过转码,获取到最后导出的G711u数据(sendData) NSUInteger datal ...
- 二:Linux 的基本命令、VI编辑器、Linux中软件安装
Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E--盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- 设置vim的默认工作路径同时与自动设当前编辑的文件所在目录为当前工作路径不冲突
问题: 想让vim自动设当前编辑的文件所在目录为当前工作路径不冲突,但是当vim新建文件的时候,工作路径会又自动切换缓存path下. 如何使当使用vim打开文件时,vim的工作路径是当前文件所在的路径 ...