1.字面量字符和元字符
1.1字面量字符
大部分字符在正则表达式中,就叫做“字面量字符”
/dog/匹配“old dog”,因为它就表示“d”、“o”、“g”三个字母连在一起。
2元字符 .、^、$、|、\、*、+、?、()、[]、{}
还有一部分字符有特殊含义,不代表字面的意思
2.1点字符 .
- 匹配除回车、换行 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
/c.t/ - 匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行
- 匹配cat、c2t、c-t等等,但是不匹配coot
2.2选择符 |
表示“或关系”(OR),
cat|dog表示匹配cat或dog。
多个选择符可以联合使用。
/a( |\t)b/.test('a\tb') // true
上面代码指的是,a和b之间有一个空格或者一个制表符
2.2字符类 []
表示字符类里的字符,只要匹配其中一个就可以
[xyz] 表示x、y、z之中任选一个匹配
2.2.1脱字符 ^
表示紧跟脱字符的字面量字符,其他字符都可以匹配。
[^xyz]表示除了x、y、z之外都可以匹配。
字符类只有脱字符[^]
表示匹配一切字符,其中包括换行符,而点号(.)是不包括换行符的
2.2.2连字符 -
表示有连续序列的字符的连续范围
字符类的连字符必须在头尾两个字符中间,才有特殊含义,否则就是字面含义
[0123456789]可以写成[0-9]
[0-9.,]
[0-9a-fA-F]
[a-zA-Z0-9-]
[1-31]
最后一个字符类[1-31],不代表1到31,只代表1到3。
在ASCII编码之中,大写字母与小写字母之间还有其他字符,结果就会出现意料之外的结果。反斜杠(\)的ASCII码在大写字母与小写字母之间
2.2.3 预定义模式
- \d
匹配0-9之间的任一数字,相当于[0-9]。 - \D
匹配所有0-9以外的字符,相当于[^0-9]。 - \w
匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。 - \W
除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。 - \s
匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。 - \S
匹配非空格的字符,相当于[^\t\r\n\v\f]。 - \b
匹配词的边界。 - \B
匹配非词边界,即在词的内部。
2.3位置字符 ^、$
用来提示字符所处的位置
- ^
表示后面跟着的字符串必须出现在开始位置 - $
表示前面紧靠的字符串必须出现在结束位置
2.4转义符 \特殊字符^、.、[、$、(、)、|、*、+、?、{、\
特殊含义的字符,要匹配它们本身,就需要在它们前面要加上反斜杠。
比如要匹配加号,就要写成+。
使用RegExp方法生成正则对象,
转义需要使用两个斜杠,因为字符串内部会先转义一次。
(new RegExp('1+1')).test('1+1') // false
(new RegExp('1\+1')).test('1+1') // true
2.5特殊字符 \cX、[\b]、\n、\r、\t、\v、\f、\0、\xhh、\uhhhh
不能打印的特殊字符
- \cX
表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符 - [\b]
匹配退格键(U+0008),不要与\b混淆 - \n
匹配换行键 - \r
匹配回车键 - \t
匹配制表符tab(U+0009) - \v
匹配垂直制表符(U+000B) - \f
匹配换页符(U+000C) - \0
匹配null字符(U+0000) - \xhh
匹配一个以两位十六进制数(\x00-\xFF)表示的字符 - \uhhhh
匹配一个以四位十六进制数(\u0000-\uFFFF)表示的unicode字符
2.6重复类 {匹配次数} ? * +
模式的精确匹配次数
- {n}
表示恰好重复n次 - {n,}
表示至少重复n次 - {n,m}
表示重复不少于n次,不多于m次
2.6.1量词符 ? * +
量词符紧跟着字符后面
?
问号表示某个模式出现0次或1次,等同于{0, 1}。
*
星号表示某个模式出现0次或多次,等同于{0,}。
+
加号表示某个模式出现1次或多次,等同于{1,}。
2.6.2贪婪模式、非贪婪模式 *? *+
- 贪婪模式
三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止 - 非贪婪模式
一旦条件满足,就不再往下匹配
*?
表示某个模式出现0次或多次,匹配时采用非贪婪模式
+?
表示某个模式出现1次或多次,匹配时采用非贪婪模式
2.7修饰符 g i m
表示模式的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用
2.7.1 g
不含g修饰符(默认情况)
第一次匹配成功后,正则对象就停止向下匹配了
每次都是从字符串头部开始匹配含有g修饰符
每次都是从上一次匹配成功处,开始向后匹配
表示全局匹配,主要用于搜索和替换
2.7.2 i
- 不含i修饰符(默认情况)
区分字母的大小写, - 含i修饰符
表示忽略大小写
2.7.3 m
- 不含m修饰符(默认情况)
^和$匹配字符串的开始处和结尾处, - 含m修饰符
m修饰符表示多行模式
^和$还会匹配行首和行尾
即^和$会识别换行符(\n)
2.8组匹配 ( )
除了返回匹配的内容(包括该组匹配的内容)
还会单独返回括号内的内容即该组匹配的内容
2.8.1概述 嵌套 \1 \2
- 不宜同时使用g修饰符,否则match方法不会捕获分组的内容
var m = 'abcabc'.match(/(.)b(.)\1\2/); m // ['abc', 'a', 'c',’a’,’c’,]
可以用\n引用括号匹配的内容,n是从1开始的自然数,表示对应顺序的括号
- 括号还可以嵌套
var m = 'abcabc'.match(/(b(.))\1\2/); m // ['bc', 'c',’bc,’c’,]
\1指向外层括号,\2指向内层括号
2.8.2非捕获组 (?:x)
只返回匹配的内容(包括该组匹配的内容)
不返回该组匹配的内容
var m = 'abc'.match(/(?:.)b(.)/); m // ["abc", "c"]
2.8.3先行断言 x(?=y)
x只有在y前面才匹配,y不会被计入返回结果,因为括号里的部分是不会返回的
var m = 'abc'.match(/b(?=c)/); m // ["b"]
2.8.4先行否定断言 x(?!y)
x只有不在y前面才匹配,y不会被计入返回结果,括号里的部分是不会返回的
/\d+(?!.)/.exec('3.14') // ["14"]](http://upload-images.jianshu.io/upload_images/5467482-2a101038cc487c26.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.字面量字符和元字符
1.1字面量字符
大部分字符在正则表达式中,就叫做“字面量字符”
/dog/匹配“old dog”,因为它就表示“d”、“o”、“g”三个字母连在一起。
2元字符 .、^、$、|、\、*、+、?、()、[]、{}
还有一部分字符有特殊含义,不代表字面的意思
2.1点字符 .
- 匹配除回车、换行 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
/c.t/ - 匹配c和t之间包含任意一个字符的情况,只要这三个字符在同一行
- 匹配cat、c2t、c-t等等,但是不匹配coot
2.2选择符 |
表示“或关系”(OR),
cat|dog表示匹配cat或dog。
多个选择符可以联合使用。
/a( |\t)b/.test('a\tb') // true
上面代码指的是,a和b之间有一个空格或者一个制表符
2.2字符类 []
表示字符类里的字符,只要匹配其中一个就可以
[xyz] 表示x、y、z之中任选一个匹配
2.2.1脱字符 ^
表示紧跟脱字符的字面量字符,其他字符都可以匹配。
[^xyz]表示除了x、y、z之外都可以匹配。
字符类只有脱字符[^]
表示匹配一切字符,其中包括换行符,而点号(.)是不包括换行符的
2.2.2连字符 -
表示有连续序列的字符的连续范围
字符类的连字符必须在头尾两个字符中间,才有特殊含义,否则就是字面含义
[0123456789]可以写成[0-9]
[0-9.,]
[0-9a-fA-F]
[a-zA-Z0-9-]
[1-31]
最后一个字符类[1-31],不代表1到31,只代表1到3。
在ASCII编码之中,大写字母与小写字母之间还有其他字符,结果就会出现意料之外的结果。反斜杠(\)的ASCII码在大写字母与小写字母之间
2.2.3 预定义模式
- \d
匹配0-9之间的任一数字,相当于[0-9]。 - \D
匹配所有0-9以外的字符,相当于[^0-9]。 - \w
匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。 - \W
除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。 - \s
匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。 - \S
匹配非空格的字符,相当于[^\t\r\n\v\f]。 - \b
匹配词的边界。 - \B
匹配非词边界,即在词的内部。
2.3位置字符 ^、$
用来提示字符所处的位置
- ^
表示后面跟着的字符串必须出现在开始位置 - $
表示前面紧靠的字符串必须出现在结束位置
2.4转义符 \特殊字符^、.、[、$、(、)、|、*、+、?、{、\
特殊含义的字符,要匹配它们本身,就需要在它们前面要加上反斜杠。
比如要匹配加号,就要写成+。
使用RegExp方法生成正则对象,
转义需要使用两个斜杠,因为字符串内部会先转义一次。
(new RegExp('1+1')).test('1+1') // false
(new RegExp('1\+1')).test('1+1') // true
2.5特殊字符 \cX、[\b]、\n、\r、\t、\v、\f、\0、\xhh、\uhhhh
不能打印的特殊字符
- \cX
表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符 - [\b]
匹配退格键(U+0008),不要与\b混淆 - \n
匹配换行键 - \r
匹配回车键 - \t
匹配制表符tab(U+0009) - \v
匹配垂直制表符(U+000B) - \f
匹配换页符(U+000C) - \0
匹配null字符(U+0000) - \xhh
匹配一个以两位十六进制数(\x00-\xFF)表示的字符 - \uhhhh
匹配一个以四位十六进制数(\u0000-\uFFFF)表示的unicode字符
2.6重复类 {匹配次数} ? * +
模式的精确匹配次数
- {n}
表示恰好重复n次 - {n,}
表示至少重复n次 - {n,m}
表示重复不少于n次,不多于m次
2.6.1量词符 ? * +
量词符紧跟着字符后面
?
问号表示某个模式出现0次或1次,等同于{0, 1}。
*
星号表示某个模式出现0次或多次,等同于{0,}。
+
加号表示某个模式出现1次或多次,等同于{1,}。
2.6.2贪婪模式、非贪婪模式 *? *+
- 贪婪模式
三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止 - 非贪婪模式
一旦条件满足,就不再往下匹配
*?
表示某个模式出现0次或多次,匹配时采用非贪婪模式
+?
表示某个模式出现1次或多次,匹配时采用非贪婪模式
2.7修饰符 g i m
表示模式的附加规则,放在正则模式的最尾部。
修饰符可以单个使用,也可以多个一起使用
2.7.1 g
不含g修饰符(默认情况)
第一次匹配成功后,正则对象就停止向下匹配了
每次都是从字符串头部开始匹配含有g修饰符
每次都是从上一次匹配成功处,开始向后匹配
表示全局匹配,主要用于搜索和替换
2.7.2 i
- 不含i修饰符(默认情况)
区分字母的大小写, - 含i修饰符
表示忽略大小写
2.7.3 m
- 不含m修饰符(默认情况)
^和$匹配字符串的开始处和结尾处, - 含m修饰符
m修饰符表示多行模式
^和$还会匹配行首和行尾
即^和$会识别换行符(\n)
2.8组匹配 ( )
除了返回匹配的内容(包括该组匹配的内容)
还会单独返回括号内的内容即该组匹配的内容
2.8.1概述 嵌套 \1 \2
- 不宜同时使用g修饰符,否则match方法不会捕获分组的内容
var m = 'abcabc'.match(/(.)b(.)\1\2/); m // ['abc', 'a', 'c',’a’,’c’,]
可以用\n引用括号匹配的内容,n是从1开始的自然数,表示对应顺序的括号
- 括号还可以嵌套
var m = 'abcabc'.match(/(b(.))\1\2/); m // ['bc', 'c',’bc,’c’,]
\1指向外层括号,\2指向内层括号
2.8.2非捕获组 (?:x)
只返回匹配的内容(包括该组匹配的内容)
不返回该组匹配的内容
var m = 'abc'.match(/(?:.)b(.)/); m // ["abc", "c"]
2.8.3先行断言 x(?=y)
x只有在y前面才匹配,y不会被计入返回结果,因为括号里的部分是不会返回的
var m = 'abc'.match(/b(?=c)/); m // ["b"]
2.8.4先行否定断言 x(?!y)
x只有不在y前面才匹配,y不会被计入返回结果,括号里的部分是不会返回的
/\d+(?!.)/.exec('3.14') // ["14"]