javascript高级程序设计第五章【中】(5.3-5.4)引用类型笔记

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

可用短属性名代替,但是要加[ ]

(未完待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值