属性
一类是修饰符相关,返回一个布尔值,表示对应的修饰符是否设置。
- ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性只读。
- global:返回一个布尔值,表示是否设置了g修饰符,该属性只读。
- multiline:返回一个布尔值,表示是否设置了m修饰符,该属性只读。
另一类是与修饰符无关的属性,主要是下面两个。
lastIndex
:返回下一次开始搜索的位置。该属性可读写,但是只在设置了g
修饰符时有意义。source
:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。
方法
1. test() 正则对象的test
方法返回一个布尔值,表示当前模式是否能匹配参数字符串。
/cat/.test('cats and dogs') // true
2.exec() 正则对象的exec
方法,可以返回匹配结果。如果发现匹配,就返回一个数组,成员是每一个匹配成功的子字符串,否则返回null
。
var s = '_x_x'; var r1 = /x/; var r2 = /y/; r1.exec(s) // ["x"] r2.exec(s) // null
exec
方法的返回数组还包含以下两个属性:
input
:整个原字符串。index
:整个模式匹配成功的开始位置(从0开始计数)。
var r = /a(b+)a/; var arr = r.exec('_abbba_aba_'); arr // ["abbba", "bbb"] arr.index // 1 arr.input // "_abbba_aba_"
3.字符串对象方法
a). match():返回一个数组,成员是所有匹配的子字符串。
b). search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
c). replace():按照给定的正则表达式进行替换,返回替换后的字符串。
d). split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。
a). String.prototype.match()字符串对象的match
方法对字符串进行正则匹配,返回匹配结果。(设置正则表达式的lastIndex
属性,对match
方法无效)
var s = '_x_x'; var r1 = /x/; var r2 = /y/; s.match(r1) // ["x"] s.match(r2) // null
如果正则表达式带有g
修饰符,则该方法与正则对象的exec
方法行为不同,会一次性返回所有匹配成功的结果。()
var s = 'abba'; var r = /a/g; s.match(r) // ["a", "a"] r.exec(s) // ["a"]
b). String.prototype.search()字符串对象的search
方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1
。
var r = /x/g; r.lastIndex = 2; // 无效 '_x_x'.search(r) // 1
上面代码中,正则表达式使用g
修饰符之后,使用lastIndex
属性指定开始匹配的位置,结果无效,还是从字符串的第一个字符开始匹配。
c). String.prototype.replace()字符串对象的replace
方法可以替换匹配的值。它接受两个参数,第一个是搜索模式,第二个是替换的内容。
str.replace(search, replacement)
搜索模式如果不加g修饰符,就替换第一个匹配成功的值,否则替换所有匹配成功的值。
'aaa'.replace('a', 'b') // "baa" 'aaa'.replace(/a/, 'b') // "baa" 'aaa'.replace(/a/g, 'b') // "bbb"
replace
方法的一个应用,就是消除字符串首尾两端的空格。
var str = ' #id div.class '; str.replace(/^s+|s+$/g, '') // "#id div.class"
d). String.prototype.split()字符串对象的split
方法按照正则规则分割字符串,返回一个由分割后的各个部分组成的数组。
str.split(separator, [limit])//该方法接受两个参数,第一个参数是分隔规则,第二个参数是返回数组的最大成员数。
匹配规则
1.字面量字符和元字符
大部分字符在正则表达式中,就是字面的含义,比如/a/
匹配a
,/b/
匹配b
。如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a
和b
),那么它们就叫做“字面量字符”(literal characters)。
/dog/.test("old dog") // true //上面代码中正则表达式的dog,就是字面量字符,所以/dog/匹配“old dog”,因为它就表示“d”、“o”、“g”三个字母连在一起。
元字符主要有以下几种:
a).点字符(.)
点字符(.
)匹配除回车(
)、换行(
) 、行分隔符(u2028
)和段分隔符(u2029
)以外的所有字符。
/c.t/
//上面代码中,c.t匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot。
b).位置字符
位置字符用来提示字符所处的位置,主要有两个字符。
(1). ^
表示字符串的开始位置
(2). $
表示字符串的结束位置
// test必须出现在开始位置 /^test/.test('test123') // true // test必须出现在结束位置 /test$/.test('new test') // true // 从开始位置到结束位置只有test /^test$/.test('test') // true /^test$/.test('test test') // false
c).选择符(|
)
在正则表达式中表示“或关系”(OR),即cat|dog
表示匹配cat
或dog
。
/11|22/.test('911') // true
上面代码中,正则表达式指定必须匹配11
或22
。
/a( | )b/.test('a b') // true //上面代码指的是,a和b之间有一个空格或者一个制表符。
其他的元字符还包括\
、*
、+
、?
、()
、[]
、{}
等,下面分开逐一介绍
d). 重复类
模式的精确匹配次数,使用大括号({}
)表示。{n}
表示恰好重复n次,{n,}
表示至少重复n次,{n,m}
表示重复不少于n次,不多于m次。
/lo{2}k/.test('look') // true /lo{2,5}k/.test('looook') // true
上面代码中,第一个模式指定o
连续出现2次,第二个模式指定o
连续出现2次到5次之间。
e). 量词符
量词符用来设定某个模式出现的次数。
? 问号表示某个模式出现0次或1次,等同于{0, 1}
。
* 星号表示某个模式出现0次或多次,等同于{0,}
。
+ 加号表示某个模式出现1次或多次,等同于{1,}
。