两者之间有什么区别?:,?!然后呢?在正则表达式中的应用

阅读时长 3 分钟读完

在前端开发中,我们经常会使用到正则表达式来进行字符串的匹配和替换。正则表达式中有一些常见的特殊字符,包括冒号(:)、逗号(,)、问号(?)、感叹号(!)等。这些特殊字符在正则表达式中有着不同的含义和用法。

冒号(:)

在正则表达式中,冒号通常用于表示命名捕获组。命名捕获组是指通过给一个捕获组设置名称的方式来引用捕获到的文本。例如,以下正则表达式可以匹配形如“2023-04-07”的日期格式:

其中,(?<year>\d{4})(?<month>\d{2})(?<day>\d{2}) 分别表示年、月、日的捕获组,并且设置了相应的名称。通过 match() 方法获取到匹配结果后,我们可以根据捕获组的名称来获取对应的值:

逗号(,)

在正则表达式中,逗号通常用于表示量词。量词用于指定匹配的次数,例如 {n} 表示匹配 n 次,{m,n} 表示匹配 m 到 n 次。逗号还可以用于分隔多个模式,例如 (pattern1, pattern2) 表示匹配 pattern1 或 pattern2。

以下是一些使用逗号的例子:

  • 匹配至少一个数字:\d+
  • 匹配三个小写字母: [a-z]{3}
  • 匹配 3 到 5 个大写字母:[A-Z]{3,5}
  • 匹配单词 "hello" 或 "world":(hello, world)

问号(?)

在正则表达式中,问号有两种不同的含义。

非贪婪模式

当问号出现在量词后面时,它可以将量词变为非贪婪模式。默认情况下,量词会尽可能地匹配更多的字符;而非贪婪模式则会尽可能地匹配更少的字符。例如,以下正则表达式可以匹配最短的含有 a 的字符串:

零宽断言

问号还可以用于表示零宽断言。零宽断言是指在匹配字符串时,不会消耗任何字符,并且只是判断字符串中是否符合某种条件。常见的零宽断言包括 lookahead 和 lookbehind。

  • lookahead: (?=pattern) 表示后面紧跟着的字符串必须匹配 pattern。
  • negative lookahead: (?!pattern) 表示后面紧跟着的字符串不能匹配 pattern。
  • lookbehind: (?<=pattern) 表示前面紧挨着的字符串必须匹配 pattern。
  • negative lookbehind: (?<!pattern) 表示前面紧挨着的字符串不能匹配 pattern。

以下是一些使用零宽断言的例子:

  • 匹配后面紧

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/13653

纠错
反馈