JavaScript正则表达式

185 阅读5分钟

正则表达式常用作检索、匹配或者替换文本,它是一种文本模式匹配的方法,在我们对复杂文本进行操作时,使用正则表达式会极大的简化我们的操作。本文将介绍正则表达式对象和匹配规则。

1. 简介

正则表达式是一种表示文本模式的方法,常用于匹配文本,例如email地址的验证等等,js中的正则表达式是Perl 5的子集。

正则表达式有两种写法:

    var reg = /abc/;
    var reg = new RegExp("abc");

上述两种写法的主要区别在于新建正则表达式的时间,前者是在编译时完成,后者则是在运行时完成。

2. 正则表达式对象

2.1 属性

正则表达式对象的属性主要有5个:

  • 与修饰符相关,都返回布尔值并且都是只读属性:
    • ignoreCase:表示是否设置了i修饰符
    • global:表示是否设置了g修饰符
    • multiline:表示是否设置m修饰符
  • 与修饰符无关:
    • lastIndex:返回下一次开始搜索的位置,且只在设置了g修饰符时才有意义
    • source:返回正则表达式相应的字符串形式。

2.2 方法(正则表达式)

  • test()

    • test接收一个字符串用于验证该字符串能否被匹配,结果返回布尔值。
    • 若正则表达式字符串为空,则能匹配所有字符串。
  • exec()

    • exec接收一个字符串并且以数组的形式返回匹配结果,含有每一个匹配成功的子字符串,若匹配失败则返回null。
    • 返回的数组含有两个属性:
      • input:表示原字符串
      • index:表示模式匹配成功的开始位置

2.3 方法(字符串)

  • match():返回一个数组,成员是所有匹配的子字符串。

    • 该方法与正则表达式的exec方法类似
    • 如果正则表达式带有g修饰符,该方法会返回所有匹配的结果,而exec则不会。
    • 设置lastIndex属性对其无效。
  • search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。若不匹配则返回-1.(忽略g修饰符和lastIndex属性)。

  • replace():按照给定的正则表达式进行替换,返回替换后的字符串。

    • 有两个参数,第一个是搜索的模式,第二个是替换的内容。
    • 搜索模式如果不加g修饰符,则替换第一个匹配的结果,否则替换所有的匹配结果。
    • 该方法的第二个参数可以使用$来指代所替换的内容。
      • $& 指代匹配的子字符串。
      • $\ 指代匹配结果前面的文本。
      • $' 指代匹配结果后面的文本。
      • $n 指代匹配成功的第n组内容,n是从1开始的自然数。
      • ? 指代美元符号$。
  • split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

2.4 匹配规则

  • 字面量字符:字符直接表示其字面的含义,如/a/、/word/。

  • 元字符:表示特殊含义

    • .字符
      • 能匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
      • 但是只能匹配一个字符。
    • 位置字符
      • ^字符:表示字符串的开始位置
      • $字符:表示字符串的结束位置
    • 选择符
      • |字符:表示关系”或“。会包括前后的多个字符
  • 重复类:用于精确设置匹配次数,使用{}表示。{n}表示重复n次,{n,}表示不少于n次,{m,n}表示重复m~n次。只匹配前一个字符

  • 量词符:用于设置模式匹配的次数,同样只匹配前一个字符:

    • ?等同于{0,1}
    • *等同于{0,}
    • +等同于{1,}
  • 贪婪模式:匹配到下一个字符不满足匹配规则为止。

    • 所有的量词符后面加上?即可变为非贪婪模式。
  • 字符类:表示一系列字符中只要匹配一个就可以,所有可供选择的字符都放在方括号中。如[abc]:表示匹配a、b、c三个字母中的任意一个。

    • 脱字符(^)
      • [^abc]:表示除了abc外所有字符都可以匹配。
      • [^]可以匹配所有字符,比.匹配更强。
      • ^字符只有在字符类的第一个位置才有意义,否则直接就是字面含义。
    • 连字符(-)
      • 对于连续序列的字符可用(-)来简写。
      • [a-z]表示所有的小写字母。
      • -字符若不在方括号之中则代表字面含义。
      • 并且连字符必须在头尾两个字符之间才有特殊含义,否则只是字面含义。
  • 转义符

    • 在正则表达式中有些特殊含义的字符,如果要匹配它们本身则需要在前面加上反斜杠。
    • 正则表达式中需要斜杠转义的一共有以下12个字符:^.[$()|*+?{\\
    • 注意若是通过RegExp构造函数生成正则对象,转义时需要使用双斜杠\\,因为字符串内部会先转义一次。
  • 修饰符

    • g修饰符
      • 默认情况下,第一次匹配成功之后正则表达式就停止匹配,若有g修饰符则会匹配所有符合条件的结果,主要用于搜索和替换。
    • i修饰符
      • 表示忽略大小写。
    • m修饰符
      • 表示多行模式,会修改^$的行为,这两个字符默认情况下是作为位置字符来匹配字符串的开始和结束位置。当加上m修饰符时会匹配行首和行尾,即会识别换行符(\n)。
      • /^bc/m.test("a\nbc")返回true。
  • 预定义模式:指常见模式的一些简写方式

    • \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 匹配非词边界,即在词的内部。
  • 特殊字符:正则表达式中表示一些不能打印的字符。

    \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 匹配一个以两位十六进制数表示的字符。 \uhhhh 匹配一个以四位十六进制数表示的unicode字符。

  • 组匹配

    • 正则表达式中通过括号表示分组匹配。
    • 使用组匹配时不宜同时使用g修饰符,否则match方法不会捕获分组内容。如:"abcabc".match(/(.)b(.)/);//返回['abc', 'a', 'c']"abcabc".march(/(.)b(.)/g)返回['abc', 'abc']
    • 组匹配中通过\数字可以引用括号匹配的内容。如:/(.)b(.)\1\2/.test('abcabc') // \1表示第一个括号匹配结果即a, \2表示第二个括号匹配结果即c
  • 非捕获组

    • (?:x)表示不返回该组匹配的内容,为了不占用组匹配。
    • 如:"abc".match(/(?:.)b(.)/)返回["abc", "c"]。
  • 先行断言

    • x(?=y)表示x只有在y的前面才匹配,并且匹配结果中不会将y计入。
    • 如:"abc".match(/b(?=c)/);返回["b"]。
  • 先行否定断言

    • x只有不在y前面才会匹配。