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]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...
随机推荐
- Ubuntu16.04 install OpenJDK8
1.按Ctrl + Alt + T打开终端.打开后,运行下面的命令来添加PPA:sudo add-apt-repository ppa:openjdk-r/ppa2.之后,更新系统包缓存并安装Open ...
- 阿里巴巴 Java 开发规约插件初体验
阿里巴巴 Java 开发手册 又一次来谈<阿里巴巴 Java 开发手册>,经过这大半年的版本迭代,这本阿里工程师们总结出来避免写出那么多 Bug 的规范,对于 Java 开发者简直就是必备 ...
- Java爬虫
作为一位Java爬虫的初学者,分享一下自己的心得.所用到的jar包 org.codehaus.jettison.jar jsoup-1.7.3.jar个人认为爬虫的实现机制:获取Docume对象-&g ...
- 当谈到 GitLab CI 的时候,我们都该聊些什么(下篇)
上篇主要介绍了 GitLab WorkFlow 以及 CI/CD 做的事情,并且详细分析 GitLab CI 跟 Runner 信息交互是如何进行的.接下来将为大家讲解 Executor 的实现,再通 ...
- python 中的enumerate()函数的用法
enumerate函数说明: 函数语法:enumerate(可遍历的对象,索引号开始的值).enumerate(sequence, [start=0]) 功能:将可循环序列sequence以start ...
- Javascript常见浏览器兼容问题
常见浏览器原生javascript兼容性问题主要分为以下几类: 一.Dom 1.获取HTML元素,兼容所有浏览器方法:document.getElementById("id")以I ...
- sys.argv向脚本中传递参数
可以向脚本中传递无限多个参数,其值是一个列表,默认sys.argv[0]内容是脚本文件路径加文件名 test.py文件中的内容如下: #! /usr/bin/python3import sys pri ...
- 数据抓取分析(python + mongodb)
分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...
- Centos 7.0 execute yum update ——File "/usr/libexec/urlgrabber-ext-down", line 75, in <module> 解决方式
[打开这个文件:/usr/lib/python2.7/site-packages/urlgrabber/grabber.py找到elif errcode in (42, 55,56) 用 eli ...
- Java基础-运算符(03)
概念: 运算符:就是对于常量和变量进行操作的符号. 表达式:用运算符连接起来的符合java语法的式子,不同的运算符连接的表达式是不同类型的表达式. 运算符分类: 算数运算符(+ - * / % ...