高程书中对正则部分介绍的偏少,特别是元字符
部分几乎没有介绍;我找了几篇不错的博客作为收录:
正则表达式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。