RegExp对象—匹配规则

1.字面量字符和元字符

RegExp对象—匹配规则_第1张图片
image.png

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 预定义模式

RegExp对象—匹配规则_第2张图片
QQ图片20170530151647.png
  • \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"]

你可能感兴趣的:(RegExp对象—匹配规则)