5.3Date()类型(未看)
5.4RegExp类型
通过RegExp类型来支持正则表达式
var expression = / pattern / flages ;
pattern:模式
任何简单或复杂的正则表达式,是在给的字符串中找与模式相匹配的字符串
flages:标志
表明正则表达式的行为
g 全局模式,不会在找到第一个匹配项后停止
i 不区分大小写模式,忽视与匹配项的大小写差距
m 多行模式,在查找到一行的末尾后为紧跟着查找下一行
转义字符转义
某些特殊字符(元字符)在正则表达式中会有特殊含义,此时就要用到转义字符 / 转义
正则表达式中的元字符
( [ { \ ^ $ | ) ? * + . ] }
元字符
更清楚的元字符大全
具有特殊意义的元字符
\d 匹配0-9的数字,相当于[0-9]
\D 匹配除了0-9的任意字符
\w 匹配0-9、a-z、A-Z、_ 的数字或字符,相当于[0-9a-zA-Z_]
\W 匹配不是字母、数字、下划线的字符
\s 匹配任意不可见字符, 包括空格、制表符、换行符等
\S 匹配任意可见字符
\b 匹配单词的边界
\t 匹配制表符
\n 匹配换行
^ 匹配字符串的开始位置
$ 匹配字符串的结束位置
\ 转义字符
. 匹配除换行符以外的任意字符
限定元字符
+ 重复1次或更多次, 相当于{1,}
? 重复0次或1次, 相当于{0,1}
* 重复任意次, 相当于{0,}
{n} 重复n次
{n,} 重复n次或者大于n次
{n,m} 重复n到m次
其他
x | y x或者y
[xyz] x、y、z中的任意一个 例:[abc] 可以匹配add中的a
[^xyz] 除了xyz中的任意一个字符 例:[abc] 可以匹配add中的dd
[a-z] 匹配a-z中的任意一个字符
[^a-z] 匹配除了a-z中的任意一个字符
() 将括号里面的字符作为整体进行匹配, 括号里面的内容是一个子表达式或者叫分组
var pattern1 = /[bc]at/i //匹配第一个bat或cat,不区分大小写
var pattern2 = /\[bc\]at/i //匹配第一个[bc]at,不区分大小写
以字面量形式定义正则表达式
使用RegExp函数来定义
var pattern1 = /[bc]at/i; //匹配第一个bat或cat,不区分大小写
var pattern2 = new RegExp("[bc]at","i");
使用RegExp函数的元字符转义
需要双重转义
/[bc]at/ 等价 new RegExp("\[b\c]at")
/.at/ 等价 new RegExp("\.at")
两者在表达意义上等价,但是以字面量形式定义始终都共用一个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");
}
第一个循环是以自变量形式定义的,所以第一次运行test()方法找到匹配项后,返回true,第二次直接从匹配项下一位即第三位开始查找,找不到,返回false,第三次重新从首位开始查找,找到匹配项返回true,依次进行
第二个循环是用RegExp函数定义的,所以第一次运行test()方法找到匹配项后,返回true,第二个又用了新的RegExp对象,所以又返回true,所以一直返回true
5.4.2RegExp实例方法
exec()
是专门为捕获组设计的,接收一个参数:需要应用模式
(pattern)的字符串,然后返回第一个匹配项信息的数组,或者在没有匹配项的情况下返回null
数组第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串
返回数组包含两个额外的属性:index和input
index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(matches); //["mom and dad and baby","and dad and baby","and baby"]
console.log(matches.index); //0
console.log(matches.input); //mom and dad and baby
console.log(matches[0]); //mom and dad and baby
一定要注意模式pattern两个单词之间的空格数一定要和text中的空格数相等,不然匹配不出来,例如mom( and dad是对的,mom ( and dad就不对了,因为多了一个空格,这一点很容易犯错!!!!!!
正则的匹配过程是从左到右的,并且是以最大可能的方式进行匹配的。所以数组第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,所以第一项就是mom and dad and baby,模式中有两个捕获组,最内部的是and baby,外部的是and dad或and dad and baby,因为匹配过程从左到右且最大可能,所以第二项是and dad and baby,第三项是and baby.
对于exec()方法来说,即使模式中设置了g全局模式,每次都只返回一个匹配项。但是未设置g的每次都只返回第一个匹配项,设置g的每次调用exec()方法会返回下一个匹配项(调用exec()方法返回的是一个数组,所以这里返回的匹配项是数组的第一个元素)
var text = "cat,fat,hat";
var pattern1 = /.at/;
var marches1 = pattern1.exec(text);
console.log(marches1[0]); //cat
marches1 = pattern1.exec(text);
console.log(marches1[0]); //cat
var pattern2 = /.at/g;
var marches2 = pattern2.exec(text);
console.log(marches2[0]); //cat
marches2 = pattern2.exec(text);
console.log(marches2[0]); //fat
test()方法
接受一个字符串参数,模式与该参数匹配时返回true,模式与该参数不匹配时返回false,只进行判断所以常被用于if语句中,可用于表单输入信息验证
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/; // \d是匹配0-9的数字,{3}指重复三次
if(pattern.test(text) == true){
console.log("The pattern was matched"); //The pattern was matched
}else{
console.log("The pattern was not matched");
}
RegExp实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量
var pattern = new RegExp("\\[bc\\]at","gi");
console.log(pattern.toString()); // /\[bc\]at/gi
console.log(pattern.toLocaleString()); // /\[bc\]at/gi
5.4.3RegExp构造函数属性
这些属性适用于作用域中所有的正则表达式,并且基于所执行的最近一次正则表达式操作而变化。这些属性有一个长属性名,和短属性名(Opera不支持)
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次的匹配项
lastParent $+ 最近一次匹配的捕获组
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布尔值,表示是否所有表达式都使用多行模式
rightContext $’ Input字符串中lastMatch之后的文本
if(pattern.test(text)){
console.log(RegExp.input); //this has been a short summer
console.log(RegExp.leftContext); //this has been a
console.log(RegExp.rightContext); //summer
console.log(RegExp.lastMatch); //short
console.log(RegExp.lastParen); //s
console.log(RegExp.multiline); //false
可用短属性名代替,但是要加[ ]
(未完待续)