返回
创建于
状态
公开

在正则表达式(Regular Expression)中,?: 这种语法被称为 “非捕获分组” (Non-Capturing Group)

它的主要作用是:组合一系列字符或表达式,但不对其匹配的内容进行编号存储。


1. 为什么要使用 (?:...)

在正则中,普通的圆括号 (...) 有两个功能:

  1. 分组 (Grouping):将多个字符看作一个整体(例如应用量词 +*)。
  2. 捕获 (Capturing):将匹配到的内容保存到内存中,方便后续通过变量(如 $1, \1)提取。

(?:...) 只保留了“分组”功能,丢弃了“捕获”功能。


2. 核心作用与优势

A. 提高性能

如果你的正则里有很多括号,但你并不需要提取它们的内容,使用 (?:...) 可以节省内存和处理时间。因为正则引擎不需要维护一个捕获索引表。

B. 避免编号干扰

当你在复杂的正则中使用多个括号时,使用非捕获分组可以防止捕获组的编号(1, 2, 3...)乱掉。

语法类型是否占用编号说明
(abc)捕获分组匹配 abc,结果存入 $1
(?:abc)非捕获分组匹配 abc,但不存入任何变量

3. 实例对比

假设我们要匹配字符串 apple apple

使用捕获分组 (apple)

  • 正则:(\w+)\s+\1
  • 这里 (\w+) 匹配了第一个 apple,并将其存入编号 1
  • \1 引用了第一个括号匹配的内容,所以它能匹配重复的单词。

使用非捕获分组 (?:apple)

  • 正则:(?:apple)\s+apple
  • 这里 (?:apple) 只是把 apple 作为一个整体进行匹配。
  • 注意: 如果你尝试写 (?:apple)\s+\1,程序会报错,因为 \1 找不到对应的捕获组。

4. 针对你提供的例子 (?:\\.br)?

这个表达式的意思是:

  1. \\.br:匹配字面意义上的 .br(第一个反斜杠是转义符)。
  2. (?:...):将 .br 组合在一起,但不提取它。
  3. ?:表示前面的这个分组(即 .br)是可选的(出现 0 次或 1 次)。

常见用途: 通常用于匹配顶级域名。例如匹配 comcom.brcom(?:\\.br)?

  • 它可以匹配 com
  • 它可以匹配 com.br
  • 但你无法通过 $1 单独取出 .br 这个部分,因为它没被“捕获”。