美文网首页饥人谷技术博客
RegExp对象—匹配规则

RegExp对象—匹配规则

作者: 林立镇 | 来源:发表于2017-05-26 21:48 被阅读0次

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

    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"]](https://img.haomeiwen.com/i5467482/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对象—匹配规则

        本文链接:https://www.haomeiwen.com/subject/uxtffxtx.html