我与二山有宿缘,彼此登临尽偶然。 。— 《登法华寺山顶》

正则表达式

正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExpexectest 方法, 以及 StringmatchmatchAllreplacesearchsplit 方法。

创建正则表达式

  • 字面量创建

    1. let reg = /[abc]/
  • 调用构造函数

    let reg = new RegExp("12312");
    

    什么时候使用构造函数创建正则?

    在脚本运行过程中,用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式

    正则表达式相关的字符需要记熟

  • \。转义字符。

  • ^。匹配输入的开始。
  • $。匹配输入的结束。
  • *。匹配前一个表达式 0 次或多次。等价于 {0,}。
  • +。匹配前一个表达式 1 次或多次。等价于 {1,}。
  • 。匹配前一个表达式 0 次或1次。等价于 {0,1}。
  • .。(小数点)默认匹配除换行符之外的任何单个字符。
  • (x)。像下面的例子展示的那样,它会匹配 ‘x’ 并且记住匹配项。其中括号被称为捕获括号。模式 /(foo) (bar) \1 \2/ 中的 ‘(foo)’ 和 ‘(bar)’ 匹配并记住字符串 “foo bar foo bar” 中前两个单词。
  • (?:x)。匹配 ‘x’ 但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。
  • x(?=y)。匹配’x’仅仅当’x’后面跟着’y’。这种叫做先行断言。例如,/Jack(?=Sprat)/会匹配到’Jack’仅当它后面跟着’Sprat’。
  • (?<=y)x。匹配’x’仅当’x’前面是’y’.这种叫做后行断言。例如,/(?<=Jack)Sprat/会匹配到’ Sprat ‘仅仅当它前面是’ Jack ‘。
  • x(?!y)。仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找。例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!.)/ 匹配一个数字。
  • (?<!y)x。仅仅当’x’前面不是’y’时匹配’x’,这被称为反向否定查找。例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/ 匹配一个数字。
  • x|y。匹配‘x’或者‘y’。
  • {n}。n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。
  • {n,}。是一个正整数,匹配前一个字符至少出现了n次
  • {n,m}。n 和 m 都是整数。匹配前面的字符至少n次,最多m次。
  • [xyz]。一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。
  • [^xyz]。一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。
  • [\b]。匹配一个退格(U+0008)。
  • \b。匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。使用”moon”举例:/\bm/匹配“moon”中的‘m’;/oo\b/并不匹配”moon”中的’oo’,因为’oo’被一个“字”字符’n’紧跟着。/oon\b/匹配”moon”中的’oon’,因为’oon’是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。
  • \B。匹配一个非单词边界。
  • \cX。当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。例如,/\cM/ 匹配字符串中的 control-M (U+000D)。
  • \d。匹配一个数字。等价于[0-9]
  • \D。匹配一个非数字。等价于[^0-9]
  • \s。匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。
  • \S。匹配一个非空白字符。
  • \w。匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]
  • \W。匹配一个非单字字符。等价于 [^A-Za-z0-9_]
  • \n。在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。比如 /apple(,)\sorange\1/ 匹配”apple, orange, cherry, peach.”中的’apple, orange,’ 。

    正则表达式的常用APi

  • exec。一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。

  • test。测试是否匹配的RegExp方法,它返回 true 或 false。
  • match。查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。
  • search。在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。
  • replace。在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
  • split。使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。

    重点来了,使用括号的子字符串匹配

    一个正则表达式模式使用括号,将导致相应的子匹配被记住。例如,/a(b)c /可以匹配字符串“abc”,并且记得“b”。回调这些括号中匹配的子串,使用数组元素[1],……[n]。
    使用括号匹配的子字符串的数量是无限的。返回的数组中保存所有被发现的子匹配。下面的例子说明了如何使用括号的子字符串匹配。

    let re = /(\w+)\s(\w+)/;
    let str = "terrence 386";
    let newStr = str.replace(re,"$2, $1");
    console.log(newStr)
    // 输出
    // 386, terrence
    

    高级搜索标识

  • g全局搜索

  • i不区分大小写
  • m多行搜索
  • s允许.匹配换行符。
  • u使用unicode码的模式进行匹配。

    总结

    不知不觉整理了这么多,本来还打算提取一下Vue中使用过的正则,正则断言使用括号的子字符串匹配,看到这个也会深有感触吧

    最后说两句

  1. 动一动您的小手,「点个赞吧」
  2. 都看到这里了,不妨 「加个关注」

正则表达式 - 图1javascript基础知识总结