返回
创建于
状态
公开
在正则表达式(Regular Expression)中,?: 这种语法被称为 “非捕获分组” (Non-Capturing Group)。
它的主要作用是:组合一系列字符或表达式,但不对其匹配的内容进行编号存储。
1. 为什么要使用 (?:...)?
在正则中,普通的圆括号 (...) 有两个功能:
- 分组 (Grouping):将多个字符看作一个整体(例如应用量词
+或*)。 - 捕获 (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)?
这个表达式的意思是:
\\.br:匹配字面意义上的.br(第一个反斜杠是转义符)。(?:...):将.br组合在一起,但不提取它。?:表示前面的这个分组(即.br)是可选的(出现 0 次或 1 次)。
常见用途:
通常用于匹配顶级域名。例如匹配 com 或 com.br:
com(?:\\.br)?
- 它可以匹配
com - 它可以匹配
com.br - 但你无法通过
$1单独取出.br这个部分,因为它没被“捕获”。