JavaScript中的正则表达式

一直觉得正则表达式很难,平时遇到都是网上copy,最近刷犀牛书的时候看到了正则部分,正好整理下知识点!

1、重复

  • {n, m}: 匹配前一项至少n次,但不能超过m次 比如 /a{2,4}/


    image.png
  • {n,}: 匹配前一项n次或者更多次 比如 /a{4,}/


    image.png
  • {n}: 匹配前一项n次 比如 /a{4}/


    image.png
  • ?: 匹配前一项0次或者多次,等价于{0,1} 比如 /a?/


    image.png
  • +: 匹配前一项1次或多次,等价于 {1,} 比如 /a+/


    image.png
  • : 匹配前一项0次或多次,等价于{0,} 比如 /a/

    image.png

2、选择

'()'用于把单独的项组合成子表达式,以便可以像处理一个独立的单元那样。
/java(script)?/ 可以匹配‘java’,其后可以有’script’,也可以没有


image.png

3、分组

带'()'的表达式可以可以被后边的表达式引用,分组的子表达式有按从左向右递增的编号,可以通过’\’后边加编号来对其进行引用,比如'\1'是对第1个分组子表达式的引用,'\n'是对第n个分组子表达式的引用。
比如,/(["'])[^"']*\1/ 是对被单引号或双引号包裹的内容进行匹配,且要求左右的引号一致,
这里如果用/["'][^"']["']/,并不能保证左右的引号一致。


image.png

需要注意的是,引用是指对匹配文本的引用,而不是对模式的引用。
若不想创建带编号的分组表达式,可以用'(?:)' 替代 '()',
注意,/(?:\w)/ 与 /(\w)/ 的区别,前者没有分组编号。


image.png
image.png

4、锚

锚,指的是位置,很多情况下需要指定匹配的位置,最常用的就是 '^' 和 '$'

  • ‘^’ 指定匹配字符串的开始
  • ’$’ 指定匹配字符串的结束

比较难理解的是 零宽正向先行断言 和 零宽负向先行断言

  • ’(?=pattern)‘ 表示零宽正向先行断言,其中’pattern’是一个正则表达式
    比如 /Java(?=Script)/,该正则表达式匹配 ‘JavaScript’ 中的 ‘Java’,但不会匹配
    ‘JavaPcript’ 中的 ‘Java’,也就是说,匹配位置的右边要匹配pattern这个正则。


    image.png

所谓零宽,就是说'(?=pattern)' 中的 'pattern' 不会消耗匹配的字符,
举个例子


image.png

就是说 '/w'匹配到了'Script' 中的 'S',也就是'(?=Script)'没有消耗掉'Script'。
所谓先行断言,是指JavaScript引擎先于扫描指针去尝试匹配后续的字符串。

  • '(?!pattern)' 表示零宽负向先行断言,与零宽正向先行断言类似,唯一的区别在于前者是不匹配pattern。

其实还有 零宽正向后行断言 和 零宽负向后行断言,不过JavaScript并不支持。

5、'\b' 与 '\B'

\b 匹配一个单词,所谓单词,就是指\w组成的字符串,也就是说,\b匹配的是\w与\W
之间的位置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容