《JavaScript高级程序设计(第三版)》学习笔记
创建正则表达式的方式
- 以字面量的形式来定义
- 使用RegExp构造函数,接受两个参数:要匹配的字符串模式,可选的标志字符串
一、字面量的形式定义
RegExp类型支持正则表达式,语法格式为:
var exp = / pattern / flags;
pattern部分表示正则表达式,flags表示标志,可以包含一个或者多个,支持的标志如下:
- g (global) 模式将被应用于所有字符串
- i (case-insensitive) 忽略其中的大小写
- m (multiline) 到达某一行文本末尾时,继续查找下一行中是否存在匹配元素
例如
//匹配所有".at",不区分大小写
var pattern = / \.at / gi;
二、RegExp构造函数
RegExp构造函数,接受两个参数:要匹配的字符串模式,可选的标志字符串
//匹配第一个bat或者cat,不区分大小写。两种方法
var pattern1 = / [bc]at /i;
var pattern2 = new RegExp("[bc]at", "i");
由于RegExp构造函数的模式参数是字符串,所以在一些情况下需要进行双重转义。所有的元字符必须进行双重转义((, ), [, ], {, }, , ^, $, |, *, +, ., ?)
/**
第一个循环中,实例属性不会重置,多次调用会失败
第二个循环中,RegExp构造函数每次都会在循环中创建正则表达式,返回为true
*/
var re = null;
var i;
for (i = 0; i < 10; i++){
re = / cat /g;
alert("字面量形式定义" + re.test("catastrophe"));
}
for (i = 0; i < 10; i++){
re = new RegExp("cat", "g");
alert("RegExp形式定义" + re.test("catastrophe"));
}
1.RegExp的实例属性
通过这些属性可以获得有关模式的各种信息
- global: boolean, 是否设置了g标志
- ignoreCase: boolean, 是否设置i标志
- lastIndex: int, 开始搜索下一个匹配项的字符位置
- multiline: boolean, 是否设置m标志
- source: 正则表达式的字符串表示按照仔面了形式而非传入函数的字符串模式返回
(通过这些属性可以获知一个正则表达式的各方面信息,然而用处不大)
function getAttr() {
var pattern1 = / \[bc\] at /i;
alert(pattern1.global);
alert(pattern1.ignoreCase);
alert(pattern1.multiline);
alert(pattern1.lastIndex);
alert(pattern1.source);
var pattern2 = new RegExp("\\[bc\\]at", "i");
alert(pattern2.global);
alert(pattern2.ignoreCase);
alert(pattern2.multiline);
alert(pattern2.lastIndex);
alert(pattern2.source);
}
2.RegExp的实例方法
主要方法是exec(),接受一个要应用模式的字符串的参数,返回第一个匹配项信息的数组,没有则返回null。返回的数组Array实例中,有两个属性:index(匹配项在字符串中的位置)和input(应用正则表达式的字符串)
function getFunc() {
var text = "mom and dad and baby";
var pattern = /mom (and dad (and) ? baby)?/gi;
var matches = pattern.exec(text);
alert("index: " + matches.index);
alert("input: " + matches.input);
alert(matches[0]); //几重括号
alert(matches[1]);
alert(matches[2]);
}
全局标志与非全局标志
function getFuncGlobal() {
var text = "cat, bat, sat, fat";
//此处没有设置全局标志g,始终返回第一个匹配项
var pattern1 = /.at/;
var matches = pattern1.exec(text);
alert("没有全局标志,index: " + matches.index);
alert("没有全局标志 " + matches[0]);
alert("没有全局标志,最后一位" + pattern1.lastIndex);
//此处设置全局标志g,依次返回匹配项
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
alert("有全局功能的index:" + matches.index);
alert("有全局功能" + matches[0]);
alert("有全局功能" + pattern2.lastIndex);
matches = pattern2.exec(text);
alert("(下一个)有全局功能的index:" + matches.index);
alert("(下一个)有全局功能" + matches[0]);
alert("(下一个)有全局功能" + pattern2.lastIndex);
}
正则表达式的第二个方法是test(),接受一个字符串参数,验证是否匹配
3.构造函数的属性
可以通过两种方式访问最新正则表达式的属性,这些属性有长属性名和短属性名之分。
function longAttr() {
var text = "this has been a short summer";
var pattern = /(.)hort/g;
//此处是长属性名称
if(pattern.test(text)){
alert("输入" + RegExp.input);
alert("左边内容" + RegExp.leftContext);
alert("右边内容" + RegExp.rightContext);
alert("输入最后一次匹配" + RegExp.lastMatch);
alert("最近一次匹配的捕获组" + RegExp.lastParen);
}
}
function shortAttr() {
var text = "this has been a short summer";
var pattern = /(.)hort/g;
//短属性名,通过[]访问
if (pattern.test(text)){
alert("输入" + RegExp.$_);
alert("左边" + RegExp["$`"]);
alert("右边" + RegExp["$'"]);
alert("最后一次匹配" + RegExp["$&"]);
alert("捕获组" + RegExp["$+"]);
}
}