基本捕获组
一个组是包含在括号 ()
一个正则表达式的一部分。这通常称为子表达式,有两个目的:
- 它使子表达式成为原子,即它将匹配,失败或重复整体。
- 它匹配的文本部分可以在表达式的其余部分和程序的其余部分中访问。
组在正则表达式引擎中编号,从 1 开始。传统上,最大组编号为 9,但许多现代正则表达式支持更高的组计数。组 0 总是匹配整个模式,用括号围绕整个正则表达式的方式相同。
无论这些组是一个接一个地放置还是嵌套,序数都会随着每个左括号而增加:
foo(bar(baz)?) (qux)+|(bla)
1 2 3 4
团体和他们的数字
在表达式达到总体匹配后,其所有组都将被使用 - 无论特定组是否已设法匹配任何内容。
一个组可以是可选的,如上面的 (baz)?
,或者是表达中未使用匹配的替代部分,如上面的 (bla)
。在这些情况下,不匹配的组不会包含任何信息。
如果量词放在一个组后面,如上面的 (qux)+
,则表达式的整体组计数保持不变。如果一个组匹配多次,则其内容将是最后一次匹配。但是,现代正则表达式风格允许访问所有子匹配事件。
如果你希望检索日志条目的日期和错误级别,如下所示:
2012-06-06 12:12.014 ERROR: Failed to connect to remote end
你可以使用这样的东西:
^(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}.\d{3} (\w*): .*$
这将提取日志条目 2012-06-06
的日期作为捕获组 1,并将错误级别 ERROR
作为捕获组 2。