跳转到主要内容
模块 4 · 第 3 课(共 4)课程中的15/32~10 min
模块课程(3/4)

非捕获组:`(?:...)`

通常只需要括号来分组(量化、交替) 并且不提取该值。在这种情况下,请使用 非捕获 版本:(?:...)。它的工作方式与 (...) 相同,但不创建 一个编号组。

Code
Pattern: (?:https?)://(\w+\.\w+)
Sample:  https://example.com e http://test.org
Match e gruppi:
  match  = "https://example.com"   gruppo1 = "example.com"
  match  = "http://test.org"        gruppo1 = "test.org"

(?:https?) 对方案进行分组以应用 ? 量词,但我们是 对将 https 作为一个组提取不感兴趣:组 1 直接是 域名。

为什么使用它

  1. 可读性:读者立即明白该组只是为了 结构,而不是提取值。
  2. 性能:引擎不必存储组的匹配。
  3. 干净编号:编号组与 “我真正需要的信息”,不受干扰。

使用非捕获组进行优化

使用 (?:...) 告诉引擎应用分组和量词规则,而不浪费内存来存储中间匹配结果。在繁重的循环或很长的文本处理中强烈建议这样做。

尝试一下

锻炼#regex.m4.l3.e1
尝试:0加载中...

从文本中的每个 URL 中提取域(`example.com`、`test.org`...)。使用“(?:https?)”作为协议(无需捕获它),并为域使用单个组。

正在加载编辑器...
显示提示

将第一组从 (https?) 更改为 (?:https?):无需捕获它,您只需要域。

3 次尝试后可用的解决方案

复习练习

锻炼#regex.m4.l3.e2
尝试:0加载中...

查找“ab”的每个重复作为单个匹配,但不捕获该组(因为您只需要整个匹配)。

正在加载编辑器...
显示提示

语法与上一课相同,但使用 (?:ab)+ 而不是 (ab)+。

3 次尝试后可用的解决方案

额外的挑战

锻炼#regex.m4.l3.e3
尝试:0加载中...

Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.

正在加载编辑器...
显示提示

使用 (?:\\.\\d{2})?使小数部分可选而不捕获它。

3 次尝试后可用的解决方案