正则表达式--规则分类

281 阅读3分钟

正则表达式是匹配模式,要么匹配字符,要么匹配位置。

本文是作者在阅读老姚的正则表达式迷你小书基础部分后整理的一些笔记


强烈推荐阅读本文的小伙伴再去看看老姚的正则表达式迷你小书

一、正则表达式的字符匹配

1、实现模糊匹配--正则强大的体现

  • 1.横向模糊匹配:使用量词,指定量词前面字符的出现次数

    • 量词(重复)及含义:
      • (1){m}恰好出现m次
      • (2){m,}出现至少m次
      • (3){m,n}出现至少m次,至多n次
      • (4)+出现至少1次 等价于{1}
      • (5)?出现0次或1次 等价于{0,1}
      • (6)*出现至少0次 等价于{0,}
  • 2.纵向模糊匹配:使用[]来提供多种可能,内部元素存在的关系

    • /a[123]c/ 表示可以匹配a1ca2ca3c中的任何一个

2、字符组 使用[]表示很多字符的组合(内部元素存在的关系,仅匹配内部元素中的一个)

  • 1.[]直接使用 [abc]

  • 2.[]-连字符一起使用,表范围,

    • (1)[a-z]任意小写字母
    • (2)[A-Z]任意大写字母
    • (3)[A-z]任意字母(大写A,小写z)
    • (4)[0-9]任意数字
    • !!!注意,当要匹配两个字符和-中的一个,为了不让引擎误解,可以将-放到最前面[-ad]、最后面[ad-]或者使用\转义[a\-d]
  • 3.[]^ 一起使用,不会匹配仅是内部的单个元素

    • 例如:/[^ab]/,不匹配"a"或"b" 字符串,其他的都可以
  • 4.[]-^一起使用,范围排除,例如: [^a-z]

  • 5.常见的简写(系统自带的)

    • (1)\w 表示任意字母、数字、_ 等价于[A-z0-9_]
    • (2)\W 表示除了字母、数字、_ 等价于[^A-z0-9_]
    • (3)\d 表示任意数字 等价于[0-9]
    • (4)\D 表示除了数字 等价于[^0-9]
    • (5)\s 表示空格、制表符、换行符和换页符
    • (6)\S 表示除了空格、制表符、换行符和换页符
    • (7). 表示除换行符和其他Unicode行终止符外的任意字符

3、量词的贪婪和惰性匹配

  • 贪婪匹配:就是会将量词中的所有情况全部匹配一次
    • 例如/2{2,5}/,会匹配22222222222222
  • 惰性匹配:就是尽可能少的匹配,语法:在量词后面添加?
    • 例如 /2{2,5}?/,就只会匹配22

4、多选分支 使用| 来提供多个模式选择

  • /匹配规则1 | 匹配规则2/ 二者选一个
  • !!!分支是惰性的,前面的能匹配上,就不往后匹配了(即使后面的匹配更精确)
    • /good|goodbye/,去匹配 "goodbye" 字符串时,结果是 "good"。

二、正则表达式的位置匹配

位置(锚)是相邻字符之间的位置。

1、^(脱字符)匹配开头,在多行匹配中匹配行开头。

  • 直接使用:^a,表示以a开始的字符串
  • 注意区分[^]

2、$(美元符号)匹配结尾,在多行匹配中匹配行结尾。

  • 例如:c$ 表示以c结束的字符串

3、\b 表示单词边界

  • \w\W 之间的位置

  • \w^开始之间的位置

  • \w$ 结束之间的位置

  • \w 任意字母、数字、_ 等价于[A-z0-9_]

  • \W 除了字母、数字、_ 等价于[^A-z0-9_]

var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#'); console.log(result); // => "[#JS#] #Lesson_01#.#mp4#"

4、\B 就是 \b 的反面的意思,非单词边界。除单词边界外的其他位置

5、() 括号中的元素会被当做一个整体,优先级高,再按相应规则去匹配

  • 1.(x) 整体匹配并记住字符x,例如:/(foo)(bar)\1\2/在这个正则表达式中,第一个()中的foo将作为一个整体被匹配,且被记住,在被记住后可以使用\1来表示,同理第二个()中的bar也将作为一个整体被匹配,且被记住,在被记住后可以使用\2来表示,依此类推,如果存在,可以使用\3\4\5
    • !!!是可以使用\n来表示被记住的整体字符,而非必须要使用
  • 2.(?:x)整体匹配但不记住字符x,例如:/(?:foo){1,2}/,在这个正则中foo将会被当做一个整体被匹配1次或2次
  • 3.x(?=y),匹配那些后面有yx,又被叫做先行断言
    • 例如:/a(?=b)/,在字符串"abacada"中只会匹配第一个a,因为只有这个a后面有b,其他的a后面没有跟着b
  • 4.(?<=y)x,匹配那些前面有yx,又被叫做后行断言
    • 例如:/(?<=b)a/,在字符串"bacadaa"中只会匹配第一个a,因为只有这个a前面有b,其他的a前面都没有b
  • 5.x(?!y),匹配那些后面没有yx,正向否定查找
    • 例如:/a(?!b)/,在字符串"abacada"中不会匹配第一个a,因为这个a后面有b,其他的a都会被匹配,因为后面没有跟着b
  • 6.(?<!y)x,匹配那些前面没有yx,又被叫做反向否定查找
    • 例如:/(?<!b)a/,在字符串"bacadaa"中只不会匹配第一个a,因为这个a前面有b,其他的a都会被匹配,因为前面都没有b

6、位置的特性

  • 可以将位置看做空格,字符串中的每个字符的左右两边都有一个或多个假定的空格,也就是位置,位置的数量不影响规则判断的结果
  • /^hello$//^^hello$$$/甚至是/(?=he)^^he(?=\w)llo$\b\b$/的匹配结果是一样的

总结:死记硬背规则是不可行的,还是得多敲多用!!!