正则这块东西以前也学得不深,也都不太熟,先回顾一下高程3的内容:
1.通过RegExp类型来支持正则表达式,使用下面的语法,可以创建一个正则表达式:
var expression = / pattern / flags
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列 3 个标志。
- g:表示全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配时立即停止
- i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
- m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行是否存在与模式匹配的项。
看例子:
//匹配所有字符串中所有'at'的实例
var pattern = /at/g
pattern.test('bat') //true
//匹配第一个'bat'或'cat',不区分大小写
var pattern = /[bc]at/i
pattern.test('aaBat') //true
//匹配所有以'at'结尾的三个字符的组合,不区分大小写
var pattern = /.at/gi
pattern.test('bbbaat')
与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义,正则表达式中的元字符包括:( [ { \ ^ $ | ? + . * } ] )
这些元字符在正则表达式中都有一或多种特殊用途,因此如果想要匹配字符串中包含的这些字符,就必须对它们进行转义。
//匹配第一个'bat'或'cat',不区分大小写
var pattern1 = /[bc]at/i
//匹配第一个'[bc]at',不区分大小写
var pattern2 = /\[bc\]at/i
pattern2.test('[bc]at') //true
//匹配以'at'结尾的3个字符的组合,不区分大小写
var pattern3 = /.at/gi
//匹配所有的'.at',不区分大小
var pattern4 = /\.at/gi
上面都是以字面量形式来定义正则表达式的,另一种创建正则表达式的方式是使用RegExp构造函数,它接收两个参数,一个是要匹配的字符串模式,另一个是可选的标志字符串,可以使用字面量定义的任何表达式,都可以使用构造函数来定义
//字面量
var pattern1 = /[bc]at/i
//RegExp构造函数
var pattern2 = new RegExp('[bc]at','i')
由于 RegExp 构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义。
//字面量模式 等价的字符串
/\[bc\]at/ "\\[bc\\]at"
/\.at/ "\\.at"
使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。在 ECMAScript 3 中,正则表达式字面量始终会共享同一个 RegExp 实例,如果重复调用会导致错误,而使用构造函数创建的每一个新 RegExp 实例都是一个新实例。
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"
RegExp对象的主要方法是exec(),该方法是专门为捕获组而设计的,exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者在没有匹配项的情况下返回null
var text = 'aaamom and dad and baby'
var pattern = /mom (and dad (and baby)?)?/gi
var matches = pattern.exec(text)
matches.index //3,表示匹配项在字符串中的位置
matches.input //aaamom and dad and baby 表示应用正则表达式的字符串,也就是原字符串text
matches[0] //'mom and dad and baby'
matched[1] //'and dad and baby'
matches[2] //'and baby'
对于 exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项
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
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
正则表达式的第二个方法是test(),它接受一个字符串参数,在模式与该参数匹配的情况下返回true;否则,返回 false。
var text = '000-00-0000'
var pattern = /\d{3}-\d{2}-\d{4}/
if(pattern.test(text)){
alert('The pattern was matched')
}
- search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,返回对应的下标
var str = 'Visit W3School!'
str.search(/W3School/) //6
str.search(/aaa/) //-1
str.search(/W3school/) //-1
str.search(/W3school/i) //6
- match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回找到的值
var str = 'Hello world!'
str.match('world') //world
str.match('!!') //null
str.match(/l/g) //['l','l','l']
str.match(/l/) //l
var str = '1 plus 2 equal 3'
str.match(/\d+/g) //[1,2,3]
- replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
var str = 'Visit Microsoft'
let newVal = str.replace('Microsoft','W3school')
newVal //'Visit W3school'
str //'Visit Microsoft'
var str="Welcome to Microsoft! "
str=str + "We are proud to announce that Microsoft has "
str=str + "one of the largest Web Developers sites in the world."
str.replace(/Microsoft/g, "W3School")
//Welcome to W3School! We are proud to announce that W3School has one of the largest Web Developers sites in the world.
- split() 方法用于把一个字符串分割成字符串数组
var str="How are you doing today?"
str.split(" ")
str.split("")
str.split(" ",3)