5

高程书中对正则部分介绍的偏少,特别是元字符部分几乎没有介绍;我找了几篇不错的博客作为收录:
正则表达式30分钟入门教程
正则表达式-理论基础篇
正则表达式-基础实战篇
最全的常用正则表达式大全

正则表达式的实例属性

RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。
global:布尔值,表示是否设置了 g 标志。
ignoreCase:布尔值,表示是否设置了 i 标志。
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
multiline:布尔值,表示是否设置了 m 标志。
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

var pattern1 = /\[bc\]at/i;

alert(pattern1.global); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"

var pattern2 = new RegExp("\\[bc\\]at", "i");

alert(pattern2.global); //false
alert(pattern2.ignoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"

正则表达式的实例方法

test()方法【是否匹配】

基本语法:regular.test(string)
参数:regular 为正则表达式;string 为所要匹配的字符串
返回值:布尔值

在模式与该参数匹配的情况下返回 true;否则,返回 false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便,因此,test()方法经常被用在 if 语句中

// 检测输入字符是否为汉字
/^[\u4e00-\u9fa5]{0,}$/.test('哈哈');    // true

// 校验电话号码
/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test('13365191314')

test()方法常用语校验用户输入的内容是否符合规范

exec()方法【捕获组】

基本语法:regular.exec(string)
参数:regular 为正则表达式;string 为所要匹配的字符串
返回值:数组或null(未匹配成功时)

1.返回数组组成元素

先来个例子:

var result = /(\d+):(\w+)/.exec('1234:abcd');
console.log(result) // --> ["1234:abcd", "1234", "abcd"]

var result = /(\d+):(\w+)/.exec('呀!出错了');
console.log(result) // --> null

上面可以看到,匹配不到字符则返回null,匹配到则返回一个数组;那么它的元素组成是怎么样的呢?

返回的数组的第一个元素是与整个正则匹配的文本,后面的组成项依次为正则中的子表达式(组)
例子中的第一个子表达式为(d+),对应的匹配值为'1234';第二个字表达式为(w+),对应的匹配值为'abcd',因此返回的数组为["1234:abcd", "1234", "abcd"]

2.返回数组的详细信息

还是上面的例子:

var result = /(\d+):(\w+)/.exec('1234:abcd');
console.log(result); // --> ["1234:abcd", "1234", "abcd"]
console.log(result.input); // ---> "1234:abcd"
console.log(result.index); // ---> 0

从上面返回的数组结果可知,数组添加了两个额外的属性,分别是:index, input
index: 匹配文本的第一个字符的位置
input: 指输入的整体的文本

3.exec()匹配注意点

执行exec函数时,尽管是全局匹配的正则表达式,但是exec方法只对指定的字符串进行一次匹配,
获取字符串中第一个与正则表达式想匹配的内容,并且将匹配内容和子匹配的结果存储到返回的数组中,例如:/d/g.exec('a22') ,返回的结果和上面的结果一样: ["2"]

下面这个例子主要是全局捕获和非全局捕获的信息对比:

var text = "cat, bat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
alert(matches.index);        //0
alert(matches[0]);           //cat
alert(pattern1.lastIndex);   //0

matches = pattern1.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern1.lastIndex); //0

var pattern2 = /.at/g;

var matches = pattern2.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern2.lastIndex); //3

matches = pattern2.exec(text);
alert(matches.index);        //5
alert(matches[0]);           //bat
alert(pattern2.lastIndex);   //8

matches = pattern2.exec(text);
alert(matches); //null
alert(pattern2.lastIndex);//0

结论:
1.同一正则表达式,在全局匹配模式下,每次实例的lastIndex属性的值为匹配文本最后一个字符的下一个位置
2.当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。


同梦奇缘
4.1k 声望1.1k 粉丝

生于忧患死于安乐