返回

深入探索JS正则表达式:重复字符、子表达式与嵌套

前端

前言

在上一篇《js中的正则表达式(1)》中,我们学习了正则表达式最基础的概念和用法,包括基本字符匹配、反向字符匹配、预定义字符类、特殊字符、匹配次数等等。掌握了这些基础知识,我们已经可以处理一些简单的文本处理任务了。然而,当我们面对更复杂的字符串处理需求时,就需要掌握更高级的正则表达式技巧了。

重复字符匹配

在正则表达式中,我们可以使用重复字符匹配符来匹配一个或多个连续出现的字符。常用的重复字符匹配符有以下几种:

  • ?:匹配0个或1个字符。
  • +:匹配1个或多个字符。
  • *:匹配0个或多个字符。

例如,正则表达式ab+c将匹配字符串"abc""abbc""abbbc"等,但不会匹配字符串"ac""ab"

子表达式

子表达式是正则表达式中另一个非常重要的概念。子表达式允许我们把一个正则表达式的一部分括起来,形成一个新的子表达式。子表达式可以用()括起来,也可以用(?:)括起来。()括起来的子表达式称为捕获组,而(?:)括起来的子表达式称为非捕获组。

捕获组和非捕获组的区别在于,捕获组可以被正则表达式引擎匹配并保存下来,而非捕获组则不能。这在处理复杂的正则表达式时非常有用。

例如,正则表达式((a|b)c)+将匹配字符串"ac""abc""abbc""abbbc"等,但不会匹配字符串"a""b"。其中的(a|b)是一个捕获组,它匹配字符a或字符b(a|b)c是一个子表达式,它匹配字符串"ac""bc"((a|b)c)+是一个重复字符匹配符,它匹配一个或多个连续出现的(a|b)c

嵌套

正则表达式可以嵌套使用,即在一个正则表达式中包含另一个正则表达式。这使得正则表达式能够处理更加复杂的字符串处理任务。

例如,正则表达式a(b|c)+d将匹配字符串"abd""abcd""abcdd"等,但不会匹配字符串"ad""ab"。其中的(b|c)是一个子表达式,它匹配字符b或字符ca(b|c)+是一个嵌套的正则表达式,它匹配字符串"ab""ac",后跟一个或多个字符b或字符ca(b|c)+d是一个正则表达式,它匹配字符串"a",后跟一个或多个字符串"ab""ac",再后跟一个字符d

rep和rep_once

rep和rep_once都是正则表达式中的量词,用于匹配重复字符。rep匹配任意数量的重复,包括0次,而rep_once匹配一次或多次重复。

例如,正则表达式a+b将匹配字符串"ab""abb""abbb"等,但不会匹配字符串"a""b"。其中的a+是一个量词,它匹配一个或多个字符aa+b是一个正则表达式,它匹配字符串"a",后跟一个或多个字符a,再后跟一个字符b

正则表达式a{2,3}b将匹配字符串"abb""abbb",但不会匹配字符串"a""ab""abbbb"。其中的a{2,3}是一个量词,它匹配2个或3个字符aa{2,3}b是一个正则表达式,它匹配字符串"a",后跟2个或3个字符a,再后跟一个字符b

结语

在本篇文章中,我们学习了正则表达式中的重复字符匹配、子表达式、嵌套、rep和rep_once等概念。这些都是正则表达式的高级用法,掌握了这些用法,我们就可以处理更加复杂的字符串处理任务了。

在下一篇《js中的正则表达式(3)》中,我们将学习正则表达式中的分组、反向引用、懒惰匹配和占有匹配等概念。敬请期待!