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]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...
随机推荐
- Log4net日志使用教程-控制台、文本、数据库三种记录方式
一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...
- cellForItemAtIndexPath没有调用
前几天碰到cellForItemAtIndexPath这个数据源方法没有被调用.这是一个collectionView返回cell(item)的数据源方法. 它没有被调用的原因有下: 1.没有设置del ...
- C#中的原子操作Interlocked,你真的了解吗?
阅读目录 背景 代码描述 越分析越黑暗 结语 一.背景 这个标题起的有点标题党的嫌疑[捂脸],这个事情的原委是这样的,有个Web API的站点在本地使用Release模式Run的时候出现问题,但是使用 ...
- jdbc-批处理
批处理 1 Statement批处理 批处理就是一批一批的处理,而不是一个一个的处理! 当你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理, ...
- OpenWRT UCI命令实现无线中继
本文主要功能主要是利用OpenWRT系统uci命令实现无线中继,主要是利用uci程序修改/etc/congfig/目录下的配置文件.实现步骤如下主要分为以下几步: 1) 安装 relayd (opkg ...
- jfinal使用jstl表达的存在的问及解决
问题 使用jstl 的el表达式 传递数据刷新页面,页面数据不显示,经过验证,数据的确传递过去,但是官方文档并没有详细描述,getModel() 不需要设get set() ,但是使用jstl el表 ...
- java如何调用接口方式一
java如何调用接口 其实对于java调用接口进行获取对方服务器的数据在开发中特别常见,然而一些常用的基础的知识总是掌握不牢,让人容易忘记,写下来闲的时候看看,比回想总会好一些. 总体而言,一些东西知 ...
- 为Android设备添加A2SD支持
相信很多用Android设备的用户都有这个问题,内部存储太小导致应用只能装那么几个,虽然rom也有提供移动到sd卡的选项,但是仅仅是移动程序文件到sd卡,并不能解决多少问题,多装几个还是会 ...
- 跟着弦哥学人工智能2—HAND-CRAFTED RULES实现的人工智能及其缺陷
隔壁有个妹纸喷我,好高兴....给她回复了下 哎呀,没想到是个妹纸,其实我就随便那么一说,没合计妹纸还专门写个檄文声讨我,受宠若惊其实你的评论一看就比较专业,所以我就去你博客大概扫了一眼,发现个大问 ...
- yii2之依赖注入与依赖注入容器
一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...