js的引用类型之RegExp正则类型(正则二)

概念

ECMAScript通过RegExp类型来支持正则表达式。

字面量形式来定义正则表达式

1
var expression = / pattern / flags;
  • pattern(模式)部分可以是任何简单或负责的正则表达式
    • 包含字符类、限定符、分组、向前查找以及反向引用
  • flags(标志)
    • g i m

使用RegExp构造函数

1
var  expression = new RegExp("pattern", "flags");

由于使用构造函数传进的参数都是字符串,所以有时需要对字符串进行双重转义。

例如\n,在正则表达式字符串中就会变成\\\\n

RegExp实例属性

RegExp的每个实例都具有下列属性:

  • global:布尔值,表示是否设置了g标志
  • ignoreCase:布尔值,表示是否设置了i标志
  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起
  • multiline:布尔值,表示是否设置了m标志
  • source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
1
2
3
4
5
6
7
8
9
10
11
var reg = /\[bc\]at/i;

console.log(reg.global);//false
console.log(reg.ignoreCase);//true
console.log(reg.lastIndex);//0
console.log(reg.multiline);//false
console.log(reg.source);//"\[bc\]at"

var reg1 = new RegExp("\[bc\\]at", "i");
console.log(reg1.source);//"\[bc\]at"
//source属性保存的是规范形式的字符串

RegExp实例方法

exec()

exec()是专门为捕获组而设计的。

exec(要应用模式的字符串);返回包含第一个匹配项信息的数组,或者在没有匹配项的情况下返回null

返回的数组虽然是Array的实例,但是包含两个额外的属性:indexinput

index:匹配项在字符串中的位置

input:应用正则表达式的字符串

1
2
3
4
5
6
7
8
9
10
var str = "mom and dad and bady";
var reg = /mom( and dad( and bady)?)?/gi;

var rst = reg.exec(str);
console.log(rst);
console.log(rst.index);
console.log(rst.input);
console.log(rst[0]);
console.log(rst[1]);
console.log(rst[2]);

对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。

在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var str = "cat,bat,sat,fat";
var reg1 = /.at/;

var rst1 = reg1.exec(str);
console.log(rst1);
console.log(rst1.index);
console.log(rst1[0]);
console.log(reg1.lastIndex);

console.log('-------rst1------');
rst1 = reg1.exec(str);
console.log(rst1);
console.log(rst1.index);
console.log(rst1[0]);
console.log(reg1.lastIndex);

console.log('-------rst1------');

var reg2 = /.at/g;

var rst2 = reg2.exec(str);
console.log(rst2);
console.log(rst2.index);
console.log(rst2[0]);
console.log(reg2.lastIndex);

console.log('-------rst2------');

var rst2 = reg2.exec(str);
console.log(rst2);
console.log(rst2.index);
console.log(rst2[0]);
console.log(reg2.lastIndex);

console.log('-------rst2------');

第一个模式reg1不是全局模式,因此每次调用exec()返回的都是第一个匹配项cat

第二个模式reg2是全局模式,因此每次调用exec()都会返回字符串中的下一个匹配项,直至搜索到字符串末尾为止。并且lastIndex的值在每次调用exec()后都会增加,而在非全局模式下则始终保持不变。

IE的js实现在lastIndex属性上存在偏差,即使在非全局模式下,该属性每次也会变化

test()

test("字符串"),符合参数匹配下返回true,否则返回false

1
2
3
var str = "apple";
var reg = /ap/;
console.log(reg.test(str));//true

toLocaleString()toString()valueOf()

toLocaleString()toString()都会返回正则表达式的字面量,与创建正则表达式的方法无关

valueOf()方法则返回正则表达式本身

1
2
3
4
var reg = new RegExp("\\[bc\\]at", "gi");
console.log(reg.toString());// /\[bc\]at/gi
console.log(reg.toLocaleString());// /\[bc\]at/gi
console.log(reg.valueOf());// /\[bc\]at/gi

可处理正则表达式的字符串方法

match()

replace()

split()

RegExp构造函数属性

长属性名 短属性名(Opera不支持) 说明
input $_ 最近一次要匹配的字符串(Opera未实现该属性)
lastMatch $& 最近一次的匹配项(Opera未实现该属性)
lastParen $+ 最近一次匹配的捕获组(Opera未实现该属性)
leftContext $` input字符串lastMatch之前的文本
rightContext $' input字符串中lastMatch之后的文本
$1 第一个匹配的捕获组($2、$3、$4、$5、$6、$7、$8、$9)
1
2
3
4
5
6
7
8
9
10
var str = "this has been a shortsummer";
var reg = /(.)hort/g;

if( reg.test(str) ) {
console.log(RegExp.input);//this has been a shortsummer
console.log(RegExp.leftContext);//this has been a(空格)
console.log(RegExp.rightContext);//summer
console.log(RegExp.lastMatch);//short
console.log(RegExp.lastParen);//s
}
1
2
3
4
5
6
7
8
9
10
var str = "this has been a shortsummer";
var reg = /(.)hort/g;

if( reg.test(str) ) {
console.log(RegExp.$_);//this has been a shortsummer
console.log(RegExp["$`"]);//this has been a(空格)
console.log(RegExp["$'"]);//summer
console.log(RegExp["$&"]);//short
console.log(RegExp["$+"]);//s
}
1
2
3
4
5
6
7
var str = "this has been a short summer";
var reg = /(..)or(.)/g;

if( reg.test(str) ) {
console.log(RegExp.$1);//sh
console.log(RegExp.$2);//t
}

模式的局限性

ECMAScript中的正则表达式仍然缺少某些语言所支持的高级正则表达式特性:

  • 匹配字符串开始和结尾的\A和\Z锚
  • 向后查找
  • 并集和交集类
  • 原子组
  • Unicode支持(单个字符除外)
  • 命名的捕获组
  • s(单行)和x(无间隔)匹配模式
  • 条件匹配
  • 正则表达式注释

综上