一、RegExp

ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似:

var exp = /pattern/flags;

patternb部分是不论什么简单的或复杂的正則表達式;flags是每一个正則表達式所带的一个或者多个标志。

正則表達式的模式匹配支持三个标志:

g:全局模式,即模式应用于整个字符串。而非在发现第一个匹配项时马上停止

i:不区分大写和小写模式

m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项。

1、创建正則表達式

JavaScript创建正则表示有两种方式:字面量创建和RegExp对象创建。

//字面量创建
var pattern1 = /[bc]at/i;
var pattern2 = /\[bc\]at/ig; //RegExp对象创建
var pattern3 = new RegExp("[bc]at","i"); //与pattern1等效
var pattern4 = new RegExp("\\[bc\\]at","ig"); //与pattern2等效

二者的差别有两个方面:对特殊字符的转换方式和实例创建。

RegExp构造函数的模式參数是字符串。所以须要对特殊字符进行双重转义。差别例如以下:

/\w\\hello/

字面量模式 等价的字符串
/\[bc\]at/ “\\[bc\\]at”
/\d.\d{1,2}/ “\\d.\\d{1,2}”
/\w\\hello/ “\\w\\\\hello”

在ECMAScript 3中。字面量形式共享一个RegExp实例。而构造函数的每一个实例都不同

var re = null,
i;
for(i=0;i<3;i++)
{
re = /cat/g;
re.test("catastrophe");
}
for(i=0;i<3;i++)
{
re = new RegExp("cat","g");
re.test("catastrophe");
}

在低版本号浏览器中,如IE6,对于第一个循环仅仅弹出一次true,其余是false。第二个循环都弹出true。

在ECMAScript 5中规定:使用正則表達式字面量跟使用RegExp构造函数一样。每次调用都创建新的实例。所以两个循环在现代浏览器中都弹出true。

2、RegExp实例属性

属性 说明
global 布尔值,是否设置了g标志
ignoreCase 布尔值,是否设置了i标志
multiline 布尔值,是否设置了m标志
lastIndex 整数,下一次匹配開始的字符位置
source 正則表達式的字符串表示

  3、方法

经常使用的方法有两个:exec()和test(),均接受一个字符串參数。

若存在匹配项,exec()返回一个数组,数组有两个额外的属性:index和input。

index表示匹配项在字符串中的位置,input表示源字符串。即exec()的參数。

在数组中,第一项是与整个模式匹配的字符串,其它项则与捕获组匹配(若没有捕获组,则仅仅包括一项)。

不存在匹配项。exec()返回null。

test()表示字符串中是否存在匹配项,存在返回true,不存在返回false。

var text = "mom and dad and bady";
var pattern = /mom( and dad( and bady)? )?/gi;
var matches = pattern.exec(text);
alert(matches.length); //3
alert(matches.index); //0
alert(matches.input); //mom and dad and bady
alert(matches[0]); //mom and dad and bady
alert(matches[1]); //and dad and bady
alert(matches[2]); //and bady

对于exec()而言,若不设置全局标志g。在同一个字符串上多次调用exec()始终返回第一个匹配项的信息;若设置了全局标志g,每次调用exec()则从上次匹配的位置处继续查找字符串。

二、String类型

String类型是字符串的对象包装类型,与Number、Boolean等一样(DOM笔记(九):引用类型、基本包装类型和单体内置对象),也能够用new来创建字符串。模式匹配在字符串处理中是非常实用的,String类型也定义了多个与其相关的方法。

match(pattern):pattern是一个字面量正則表達式或RegExp对象。本质上和exec()方法一样。

var text = "cat,bat,sat,fat";
var pattern = /.at/;
var matches = text.match(pattern);
//var matches = pattern.exec(text);
alert(matches.index);
alert(matches[0]);
alert(pattern.lastIndex);

search(pattern):參数和match()同样,从开头開始查找。返回第一个匹配项的索引,若没有匹配项,返回-1

var text = "cat,bat,sat,fat";
var pos = text.search(/at/);
alert(pos); //1

replace(oldstring,newstring):用newstring替换oldstring。第一个字符串能够是一个模式对象,第二个字符串能够结合捕获组使用,或者是一个函数。

var text = "cat,bat,sat,fat";
var pattern = /(.at)/g;
var re = text.replace(pattern,"word($1)");
alert(re); //word(cat),word(bat),word(sat),word(fat)

假设模式中没有捕获组,则用空字符串取代。

  若第二个參数是函数,则该函数接收三个參数:模式匹配项、模式匹配项在字符串中的位置和原始字符串。

function htmlEscape(text)
{
return text.replace(/[<>"&]/g,function(match,pos,text)
{
switch(match)
{
case "<":
return "&lt;";
case ">":
return "&gt;";
case "&":
return "&amp;";
case "\"":
return "&quot;";
}
});
}
//返回:&lt;p class=&quot;greeting&quot;&gt;helloWorld&lt;/p&gt;
alert(htmlEscape("<p class=\"greeting\">helloWorld</p>"));

若正則表達式中定义了多个捕获组,则传递给函数的依次是匹配项、第一个捕获组、第二个捕获组。。

。。最后两个參数不变。

split(string[,limit]):分隔字符串,返回一个数组。

string能够是一个普通的字符串,也能够是一个模式匹配对象。可选的limit表示返回数组的大小

var colorText = "red,blue,yellow,black";
alert(colorText.split(",")); //[red,blue,yellow,black]
alert(colorText.split(",",2)); //[red,blue]
alert(colorText.split(/\W/)); //[red,blue,yellow,black]

三、正則表達式的规则

字符

说明

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。比如,“n”匹配字符“n”。

“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。

^

匹配输入字符串的開始位置。

假设设置了RegExp对象的Multiline属性。^也匹配“\n”或“\r”之后的位置。

$

匹配输入字符串的结束位置。

假设设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表达式零次或多次。比如,zo*能匹配“z”以及“zoo”。

*等价于{0,}。

+

匹配前面的子表达式一次或多次。

比如,“zo+”能匹配“zo”以及“zoo”。但不能匹配“z”。

+等价于{1,}。

?

匹配前面的子表达式零次或一次。比如,“do(es)?”能够匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}

n是一个非负整数。

匹配确定的n次。比如,“o{2}”不能匹配“Bob”中的“o”。可是能匹配“food”中的两个o。

{n,}

n是一个非负整数。至少匹配n次。比如,“o{2,}”不能匹配“Bob”中的“o”。但能匹配“foooood”中的全部o。

“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}

m和n均为非负整数,当中n<=m。

最少匹配n次且最多匹配m次。比如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在不论什么一个其它限制符(*,+,?,{n},{n,}。{n,m})后面时。匹配模式是非贪婪的。

非贪婪模式尽可能少的匹配所搜索的字符串。而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

比如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配全部“o”。

.

匹配除“\n”之外的不论什么单个字符。

要匹配包含“\n”在内的不论什么字符。请使用像“[.\n]”的模式。

(pattern)

匹配pattern并获取这一匹配。所获取的匹配能够从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。

(?:pattern)

匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是非常实用。比如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

(?=pattern)

正向预查。在不论什么匹配pattern的字符串開始处匹配查找字符串。

这是一个非获取匹配,也就是说,该匹配不须要获取供以后使用。比如。“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配 “Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后。在最后一次匹配之后马上開始下一次匹配的搜索,而不是从包括预查的字符之后開始。

(?!pattern)

负向预查,在不论什么不匹配pattern的字符串開始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不须要获取供以后使用。比如 “Windows(?

!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

预查不消耗字符。也就是说,在一个匹配发生后,在最后一次匹配之后马上開始下一次匹配的搜索,而不是从包括预查的字符之后開始

x|y

匹配x或y。比如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

[xyz]

字符集合。

匹配所包括的随意一个字符。

比如。“[abc]”能够匹配“plain”中的“a”。

[^xyz]

负值字符集合。匹配未包括的随意字符。比如。“[^abc]”能够匹配“plain”中的“p”。

[a-z]

字符范围。

匹配指定范围内的随意字符。比如,“[a-z]”能够匹配“a”到“z”范围内的随意小写字母字符。

[^a-z]

负值字符范围。

匹配不论什么不在指定范围内的随意字符。比如。“[^a-z]”能够匹配不论什么不在“a”到“z”范围内的随意字符。

\b

匹配一个单词边界。也就是指单词和空格间的位置。

比如,“er\b”能够匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B

匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\d

匹配一个数字字符。等价于[0-9]。

\D

匹配一个非数字字符。

等价于[^0-9]。

\s

匹配不论什么空白字符。包含空格、制表符、换页符等等。等价于[\f\n\r\t\v]。

\S

匹配不论什么非空白字符。等价于[^\f\n\r\t\v]。

\w

匹配包含下划线的不论什么单词字符。等价于“[A-Za-z0-9_]”

\W

匹配不论什么非单词字符。等价于“[^A-Za-z0-9_]”。

\f、\n、\r、\t、\v

匹配一个换页符、换行符、回车符、水平制表符、垂直制表符,分别等价于\x0c和\cL、\x0a和\cJ、\x0d和\cM、\x09和\cI、\x0b和\cK

\cx

匹配由x指明的控制字符。比如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之中的一个。否则。将c视为一个原义的“c”字符。

\xn

匹配n,当中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。

比如,“\x41”匹配“A”。

“\x041”则等价于“\x04&1”。

正則表達式中能够使用ASCII编码。

\num

匹配num,当中num是一个正整数。对所获取的匹配的引用。比如,“(.)\1”匹配两个连续的同样字符。

\n

标识一个八进制转义值或一个向后引用。假设\n之前至少n个获取的子表达式。则n为向后引用。

否则。假设n为八进制数字(0-7)。则n为一个八进制转义值。

\nm

标识一个八进制转义值或一个向后引用。假设\nm之前至少有nm个获得子表达式。则nm为向后引用。假设\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。假设前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。

\nml

假设n为八进制数字(0-3),且m和l均为八进制数字(0-7)。则匹配八进制转义值nml。

\un

匹配n。当中n是一个用四个十六进制数字表示的Unicode字符。比如。\u00A9匹配版权符号(?)。

四、常见正則表達式经常使用的正則表達式归纳

原文首发:http://www.ido321.com/1355.html

DOM笔记(十):JavaScript正則表達式的更多相关文章

  1. JavaScript正則表達式知识汇总

    Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegE ...

  2. javascript 正則表達式补充

    定义 JavaScript种正則表達式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  3. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  4. javascript正則表達式 &quot;\b&quot;问题

    preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...

  5. JavaScript 正則表達式

    一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...

  6. python进阶十_正則表達式(一)

    近期状态一直不太好,至于原因,怎么说呢,不好说,总之就是纠结中覆盖着纠结,心思全然不在点上,希望能够借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想,假设真的是我自己的问题呢,曾经我 ...

  7. 经常使用的正則表達式归纳—JavaScript正則表達式

    来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...

  8. javascript——正則表達式

    正則表達式(RegExp对象):主要用于表单验证 1.创建正則表達式: (1).var ret = /pattern/; pattern是内容.能够是正則表達式的内容,能够是字符或是其它的内容 (2) ...

  9. javascript正則表達式

    定义一个正則表達式 能够用字面量 var regex = /xyz/; var regex = /xyz/i; 也能够用构造函数 var regex = new RegExp('xyz'); var ...

随机推荐

  1. 媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. springMVC中HTTP PUT请求该如何传输请求参数呢?

    对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理,所以Spring拿不到.解决方案:1.修改tomcat的server.xml:   <Connector p ...

  3. @Transactional事务几点注意

    这里面有几点需要大家留意:A. 一个功能是否要事务,必须纳入设计.编码考虑.不能仅仅完成了基本功能就ok.B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常.测试回滚),确保事务生效.C ...

  4. [Android Pro] 组件化:企业级大型项目必经之路

    cp : https://www.csdn.net/article/2011-02-11/291667 摘要:超过一年以上.活跃开发的项目往往到后期陷入了一些共性的问题: 构建速度慢,往往生成一次最终 ...

  5. 使用Python读取Mp3的标签信息

    什么是ID3 MP3是音频文件最流行的格式,它的全称是 MPEG layer III.但是这种格式不支持对于音频内容的描述信息,包括歌曲名称.演唱者.专辑等等. 因此在1996年,Eric Kemp在 ...

  6. Linux文本行倒序排列6种方法

    Linux文本行倒序排列6种方法 1. 命令方法: nl filename | sort -nr | cut -f2 这个方法很unix风格,使用多命令组合完成某种功能是典型的unix特点 单命令: ...

  7. Chapter 7 -- Functional

    Caveats 说明 As of Java 7, functional programming in Java can only be approximated through awkward and ...

  8. cannot be resolved. It is indirectly referenced from required .class files

    缺少引用. 把缺少的引用在导入一下...如果是mavan 在当前moudle里也要把 dependency加进来

  9. Android studio 编译失败Error:Could not read entry &#39;:app:processDebugManifest&#39; from cache taskArtifacts.b

    Android studio 编译失败 Error:Could not read entry ':app:processDebugManifest' from cache taskArtifacts. ...

  10. Java中 CopyOnWriteArrayList 的使用

    java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误. 看如下代码: import java.util.Array ...