5.4 RegExp类型
ECMAScript通过RegExp类型来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。
- var expression=/pattern/flags;
复制代码
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以带有一个或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志。
1、g:表示全局(global)模式,即模式 将被应用于所有字符串, 而非在发现第一个匹配项时立即停止;
2、i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
3、m: 表示多行( multiline)模式,即在达到一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
因此,一个正则表达式就是一个模式与上述3个标志的组合体。不同的组合产生不同的结果,如下面的例子所示:
- /*
- *匹配字符创中所有"at"的实例
- */
- var pattern1=/at/g;
- /*
- *匹配第一个"bat"或"cat",不区分大小写
- */
- var pattern2=/[bc]at/i;
- /*
复制代码
与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式的元字符包括:( { [ \ ^ $ | ) ? * + . ] }
这些元字符在正则表达式中都有一或多中特殊用途,因此如果想要匹配字符串中包含发的这些字符,就必须对它们进行转义。下面给出几个例子:
- /*
- *匹配第一个"bat"或"cat",不区分大小写
- */
- var pattern1=/[bc]at/i;
- /*
- *匹配第一个"[bc]at",不区分大小写 PS:需要多方括号进行转义
- */
- var pattern2=/\[bc\]at/i;
- /*
- *匹配所有以"at"结尾的3个字符的组合,不区分大小写
- */
- var pattern3=/.at/gi;
- /*
- *匹配所有".at",不区分大小写 PS:需要对句点进行转义
- */
- var pattern4=/\.at/gi;
复制代码
前面的这些例子,都是以字面量形式来定义的正则表达式。另一种创建正则表达式的方式是使用RegExp构造函数,它接受两个参数:一个是匹配的字符串模式,二是可选的标志字符串。可以使用字面量定义的任何表达式,都可以使用构造函数来定义,如下面的例子所示:
- /*匹配第一个"bat"或"cat",不区分大小写*/
- var pattern1=/[bc]at/i;
- /*与pattern1相同,但是使用构造函数创建的*/
- var pattern2=new RegExp("[bc]at","i");
复制代码
这里,pattern1hepattern2是两个完全相同的正则表达式。需要注意的,传递给RegExp构造函数的两个参数都是字符串(不能把正则表达式字面量传递给RegExp构造函数)。由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。所有元字符都必须双重转义,那些已经转义过的字符串也是如此,例如\n(字符\在字符串中通常被转义为\\,而在正则表达式字符串中就会变成\\\)。下表给出了一些模式,左边是这些字面量形式,右边是使用RegExp构造函数定义相同模式时使用的字符串。
|
字面量模式
|
等价的字符串
|
|
/\[bc]at/
|
"\\[bc\\]at"
|
|
/\.at/
|
"\\.at"
|
|
/name\/age
|
"name\\/age"
|
|
/\d.\d{1,2}/
|
"\\d.\\d{1,2}"
|
|
/\w\\hello\\123/
|
"\\w\\\\hello\\\\123"
|
使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。在ECMAScript 3 中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新的RegExp实例都是一个新的实例,来看下面的例子:
- var re=null,i;
- for(i=0;i<10;i++)
- {
- re=/cat/g;
- re.test("catastrophe");
- }
- for(i=0;i<10;i++)
- {
- re=new RegExp("cat","g");
- re.test("catastrophe");
- }
复制代码
在下一个循环中,即使是循环体中指定的,但实际上只是为/cat/创建了一个RegExp实例。由于实例属性(下一节介绍实例属性)不会重置,所以在循环中再次调用test()方法会失败。这是因为第一次调用test()找到了”cat“,但是第二次调用是从索引为3的字符(上一次匹配的末尾)开始的,所以就找不到它了。由于会测试到字符串末尾,所以下一次在调用test()就有从头开始了。
第二个循环使用RegExp构造函数在每次循环中创建正则表达式。因为每次迭代都会创建一个新的RegExp实例,所以每次调用test()都会返回true。
ECNAScript 5 明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例。IE9+、FF4+和Chrome都据此做出了修改。
注:我是小小白,欢迎各位大神指出文中不对的地方^_^~~
5.4 RegExp类型的更多相关文章
- 引用类型-RegExp类型
JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型 定义正则表达式有两种方式 1.用字面量形式定义正则表达式: ver expression = /patterns/flags; ...
- RegExp类型exec()方法的返回值说明
之前看别人写的插件经常会用到RegExp对象来验证输入,并且获取一些那时我并不晓得是什么东西的数组,来取值进行自定义的逻辑处理.今天学习了一下RegExp类型.终于有了一个初步的了解,至少不会看一会就 ...
- RegExp类型,单体内置对象
1.RegExp类型: 1)什么是正则表达式:RegExp --是一种规则,模式 --强大的字符串匹配工具 --创建: --使用RegExp构造函数创建:var re=new ...
- js中RegExp类型
ECMAScript通过RegExp类型来支持正则表达式. var expression = / pattern / flag ; pattern可以是任意的正则表达式.每个正则都带有标志,用以正则表 ...
- 《JavaScript高级程序设计》读书笔记 ---RegExp 类型
ECMAScript 通过RegExp 类型来支持正则表达式.使用下面类似Perl 的语法,就可以创建一个正则表达式.var expression = / pattern / flags ; 其中的模 ...
- Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型
JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...
- 随笔记录--RegExp类型
阅读Javascript高级程序设计第五章 -- RegExp类型总结 对于基础教程部分, 有小伙伴不熟悉的,可以参考 正则表达式 - 教程 1. 基础部分回顾: ECMASript通过RegExp类 ...
- RegExp类型(正则表达式)
直接量语法 /pattern/attributes 创建 RegExp 对象的语法: new RegExp(pattern, attributes); 一.attributes: 修饰符 描述 i 执 ...
- JS RegExp类型
用来定义正则表达式的类型, 1. 通常情况下,我们可以直接用字面量形式来定义正则表达式,格式如下: var expression = /pattern/flags pattern为正则表达式 flag ...
随机推荐
- openStack images概念及维护
更改以创建镜像的属性 glance image-update img-uuid --property architecture=arm --propertyhypervisor_type=qemu C ...
- 自己写的sql server触发器练练--高手请您跳过吧
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER TRIGGER [insertReplyToic] ON [dbo].[bbsReplyTopic] ...
- <转>LINQ To SQL 语法及实例大全
一篇很全很强大的linq to sql 总结 来源:http://blog.csdn.net/pan_junbiao/article/details/7015633 目录(?)[-] LINQ to ...
- SQL server与Oracle触发器的创建与使用
SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...
- C++输出中文字符(转)
C++输出中文字符 1. cout 场景1: 在源文件中定义 const char* str = "中文" 在 VC++ 编译器上,由于Windows环境用 GBK编码,所以字符串 ...
- MongoDB入门学习(一)—— 安装和启动
最近由于工作需要,开始学习MongoDB数据库了.第一篇博文就从这里开始吧,以此记录下学习中的点点滴滴,为自己加油呢! (一) MongoDB简介 网上搜搜了一下:(来源:http://www.run ...
- 使用泛型对java数组扩容
编写一个通用方法,其功能是将数组扩展到10%+10个元素(转载请注明出处) package cn.reflection; import java.lang.reflect.Array; public ...
- mina学习资料整合
最好的资料当然是官方文档:https://mina.apache.org/mina-project/userguide/user-guide-toc.html 官方文档,配合源码中的example例子 ...
- 监听器和web国际化
一.监听器 1.监听器:监听器就是一个java程序,功能是监听另一个java对象变化(方法调用.属性变更) 2.监听器监听过程:事件源.事件对象.监听器对象.操作事件源 1).存在被监听对象(事件源) ...
- C# 控件包
http://www.cnblogs.com/Keep-Silence-/archive/2013/01/22/2871694.html