1. 正则表达式创建方式:
① 字面量的形式创建
语法:var expression = / pattern / flags;
pattern(模式):是一个正则表达式。
flags(标志):可以是一个或多个
g(代表全局global模式),该模式可以应用到所有的字符串。
i(不区分大小写模式),在确定匹配项时忽略模式与字符串的大小写。
m(多行multiline模式),在匹配到一行末尾时,会自动匹配下一行是否存在与模式匹配的项。
如:
匹配字符串中所有"at"的实例: var pattern1 = /at/g;
匹配第一个"bat"或"cat",不区分大小写:var pattern2 = /[bc]at/i;
匹配所有以"at"结尾的 3 个字符的组合,不区分大小写:var pattern3 = /.at/gi;
注意:模式中使用的所有元字符( ( [ { \ ^ $ | ) ? * + . ] } )当用来匹配字符串中包含的这些字符,都必须进行转义。
如:
匹配第一个" [bc]at",不区分大小写:/\[bc\]at/i;
匹配所有".at",不区分大小写:/\.at/gi;
② RegExp构造函数(接受两个参数,匹配字符串的模式---是一个字符串和可选的标志字符串---是一个字符串)
语法:var pattern1 = new RegExp("at", "g");
因为两个参数都是字符串,所以遇到元字符要进行双重转义。
字面量 RegExp构造函数
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
/name\/age/ "name\\/age"
/\d.\d{1,2}/ "\\d.\\d{1,2}"
/\w\\hello\\123/ "\\w\\\\hello\\\\123"
2. RegExp对象的属性:
global:布尔值,用来判断是否设置了g标志。
ignoreCase:布尔值,用来判断是否设置了i标志。
multiline:布尔值,用来判断是否设置了m标志。
lastIndex:整数,用来获取开始搜索下一个匹配项的字符位置。开始为0。
source:返回按照字面量的形式的字符串模式。
var pattern1 = /\[bc\]at/i;
pattern1.global-----false
pattern1.ignoreCase-----true
pattern1.multiline-----false
pattern1.lastIndex-----0
pattern1.source-----"\[bc\]at"
var pattern2 = new RegExp("\\[bc\\]at","i");
pattern2.source-----"\[bc\]at" //虽然是以构造函数的形式创建正则表达式,但是还是以字面量的形式返回字符串模式
3. RegExp对象的方法:
① exec():可以得到捕获组,该函数接收一个参数即待 应用 模式的字符串。返回值:一个数组,该数组有两个额外的属性 index(匹配项在字符串中出现的位置,即模式pattern在字符串中出现的位置),input(即exec函数接收的参数,待应用模式的字符串),数组的第一项是待应用 模式 的字符串中与模式相匹配的字符串,其他项是待应用 模式 的字符串中与模式的捕获组相匹配的字符串(如果没有找到则是undefined,如果模式中没有包含捕获组则该数组只包含第一项)。
如:
例一:
var text = "mom and dad and baby";------带应用 模式 的字符串
var pattern = /mom( and dad( and baby)?)?/gi; -----模式,匹配项
var matches = pattern.exec(text);-----数组
alert(matches.index); ----- 匹配项在字符串中出现的位置-----0
alert(matches.input); -----待应用 模式 的字符串----mom and dad and baby
alert(matches[0]);-----待应用 模式 的字符串中与模式相匹配的字符串----mom and dad and baby
alert(matches[1]);-----待应用 模式 的字符串中与模式的捕获组相匹配的字符串----外层捕获组----and dad and baby
alert(matches[2]); -----待应用 模式 的字符串中与模式的捕获组相匹配的字符串----内层捕获组----and baby
例二:
全局模式下:接着上一次的位置开始
var text = "cat,bat,sat,fat";-----待应用 模式 的字符串
var pattern1 = /.at/g;-----模式,匹配项
var matches = pattern1.exec(text);-----数组
console.log(matches);-----["cat", index: 0, input: "cat,bat,sat,fat", groups: undefined]
console.log(pattern1.lastIndex);-----搜索下一个匹配项字符的位置----3
console.log(matches.index);-----匹配项在字符串中出现的位置-----0
console.log(matches[0]);-----待应用 模式 的字符串中与模式相匹配的字符串----cat
matches = pattern1.exec(text);-----再一次运行该函数,因为是全局模式下,所以会接着上一次搜索
console.log(matches);------["bat", index: 4, input: "cat,bat,sat,fat", groups: undefined]
console.log(pattern1.lastIndex);-----搜索下一个匹配项字符的位置-----7
非全局模式下:从头再来
var text = "cat, bat, sat, fat";------待应用 模式 的字符串
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
② text()函数:接收一个字符串参数,在模式与字符串匹配的情况下返回true,否则返回false。在只想知道目标字符串与模式是否匹配,不需要知道具体的文本内容是可以用。
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
RegExp 实例继承的 toLocaleString()和 toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。
var pattern = new RegExp("\\[bc\\]at", "gi");
alert(pattern.toString()); // /\[bc\]at/gi
alert(pattern.toLocaleString()); // /\[bc\]at/gi
4. RegExp()构造函数属性
长属性名 短属性名(使用时部分要用方括号语法访问) 意义
input $_ 待应用 模式 的字符串
lastMatch $& ["$&"] 最近一次待应用 模式 的字符串中被匹配的项
lastParen $+ ["$+"] 最近一次匹配的捕获组
leftContext $` ["$`"] 待应用 模式 的字符串中被匹配项之前的文本
rightContext $' ["$'"] 待应用 模式 的字符串中被匹配项之后的文本
multiline $* ["$*"] 布尔值,表示是否所有的表达式中都使用多行模式
例一:
var text = "this has been a short summer"; ----待应用 模式 的字符串
var pattern = /(.)hort/g; -----模式,匹配项
if(pattern.test(text)){ ----如果可以匹配
alert(RegExp.input); ----待应用 模式 的字符串-----this has been a short summer
alert(RegExp.leftContext); ----待应用 模式 的字符串中被匹配项之前的文本----this has been a
alert(RegExp.rightContext); ----待应用 模式 的字符串中被匹配项之后的文本----summer
alert(RegExp.lastMatch); ----最近一次待应用 模式 的字符串中被匹配的项----short
alert(RegExp.lastparen); ----最近一次匹配的捕获组----s
alert(RegExp.multiline);----表示是否所有的表达式中都使用多行模式----false
}