模块 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 直接是
域名。
为什么使用它
- 可读性:读者立即明白该组只是为了 结构,而不是提取值。
- 性能:引擎不必存储组的匹配。
- 干净编号:编号组与 “我真正需要的信息”,不受干扰。
使用非捕获组进行优化
使用 (?:...) 告诉引擎应用分组和量词规则,而不浪费内存来存储中间匹配结果。在繁重的循环或很长的文本处理中强烈建议这样做。
尝试一下
锻炼#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 次尝试后可用的解决方案