DOM笔记(十):JavaScript正則表達式
一、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 "<";
case ">":
return ">";
case "&":
return "&";
case "\"":
return """;
}
});
}
//返回:<p class="greeting">helloWorld</p>
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匹配版权符号(?)。 |
四、常见正則表達式:经常使用的正則表達式归纳
DOM笔记(十):JavaScript正則表達式的更多相关文章
- JavaScript正則表達式知识汇总
Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegE ...
- javascript 正則表達式补充
定义 JavaScript种正則表達式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- JavaScript 正則表達式
一.简单介绍 1.什么是正則表達式 正則表達式本身就是一种语言,这在其他语言是通用的. 正則表達式(regular expression)描写叙述了一种字符串匹配的模式,能够用来检查一个串是否含有某种 ...
- python进阶十_正則表達式(一)
近期状态一直不太好,至于原因,怎么说呢,不好说,总之就是纠结中覆盖着纠结,心思全然不在点上,希望能够借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想,假设真的是我自己的问题呢,曾经我 ...
- 经常使用的正則表達式归纳—JavaScript正則表達式
来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...
- javascript——正則表達式
正則表達式(RegExp对象):主要用于表单验证 1.创建正則表達式: (1).var ret = /pattern/; pattern是内容.能够是正則表達式的内容,能够是字符或是其它的内容 (2) ...
- javascript正則表達式
定义一个正則表達式 能够用字面量 var regex = /xyz/; var regex = /xyz/i; 也能够用构造函数 var regex = new RegExp('xyz'); var ...
随机推荐
- 苹果无法连接到itunes store怎么办
方法1:设置--还原--还原网络设置,再进app store就可以了.方法2:重置访问限制“设置”–> “通用” –> “访问限制”,开启访问限制5秒,然后再关闭访问限制.方法3:重置当前 ...
- Xcode修改项目的Build Location
Xcode默认project通过build输出的目录,存放于目录 /Users/用户名/Library/Developer/Xcode/DerivedData/产品名称-hjwqiconnjhpjle ...
- Android之2次打开添加友盟统计代码,后缀会添加广告
这里首先列明步骤, 做一个标识仅此而已. 1. 首先使用apktool来反编译你待需要加入友盟统计的apk包, 具体如何使用与配置apktool, 请参考我关于apktool配置的文章. 2. 然后自 ...
- 实用ExtJS教程100例-007:ExtJS中Window组件最小化
在上一节中我们演示了如何使用ExtJS的Window组件,这篇内容中我们来演示一下如何将窗口最小化. 要让ExtJS标题栏中显示最小化按钮并不麻烦,只需要设置 minimizable: true 即可 ...
- selector属性介绍
本文来自:http://blog.csdn.net/brokge/article/details/9713041 简介: 根据不同的选定状态来定义不同的现实效果 分为四大属性: android:sta ...
- C# 获取文件的MIME类型
在C#中获取文件的MIME类型(Content Type)的方法如下 一.使用MimeMapping类 在System.Web程序集中,当前为静态类,就一个获取 // // 摘要: // 映射文档扩展 ...
- 回顾 Exchange 2007 SCC 安装-供需要的人参考!
最近可能会涉及到一个项目的升级,客户目前是基于SCC+SCR的一种工作模式,因为之前对SCR 了解很少,所以需要搭建一个SCC+SCR 平台来做一个整体的POC,来还原整个安装和升级过程. 首先我们先 ...
- LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)
题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...
- iOS开发-UIRefreshControl下拉刷新
下拉刷新一直都是第三库的天下,有的第三库甚至支持上下左右刷新,UIRefreshControl是iOS6之后支持的一个刷新控件,不过由于功能单一,样式不能自定义,因此不能满足大众的需求,用法比较简单在 ...
- 网页重构应该避免的10大 CSS 糟糕用法
对于网页重构来说,CSS禅意花园 是网页布局从 table 表格转到了 html +css 的标志 .这些年来,随着我们的网站越来越复杂:html5,css3,新的技术.新的属性,越来越多的开发者开始 ...