上一章节介绍了正则表示分组圆括号 “()” 的用法,本章节将介绍怎样引用我们创建的分组。
在之前使用圆括号的过程中,与位于圆开括号和圆闭括号之间的模式匹配的内容都会被捕获。例如:
(hello)( )(world)
匹配信息如下图:
上图中,模式定义了三个分组,将被捕获的分组指定给变量 $1、$2 和 $3
捕获分组的编号是有圆括号在正则表达式中的位置决定。
例如:在使用下面的模式:
(hello)( )(world)
匹配下面的文本时:
hello world
字符序列 hello(它位于第一个圆开括号之后) 就是变量 $1 的值;而字符序列 “ ” 空格(它位于第二个圆开括号)是变量 $2 的值;字符序列 world(它位于第三个圆开括号之后) 就是变量 $3 的值;匹配结果如下图:
上图中,Group 1 表示 $1,Group 2 表示 $2,Group 3 表示 $3。
如果圆括号之间存在嵌套呢?该如何确定分组编号,如下:
(((hello)( ))((world)\.?))
上面模式将创建6个分组,如下图:
还是以前面的模式(“(hello)( )(world)”)为例,将文本 “hello world” 替换成 “hello_world” 文本。如下图:
上图中,替换表达式 “$3_$1” 将分别引用 $3 和 $1 分组。
如果在一个模式中有分组被命名,那么你还可以重用该命名分组。假如有如下文本:
hello_world_hello
使用下面模式匹配该文本前面的 “hello” 文本。如下:
(?<g1>hello)
然后你可以再使用该分组,如下:
(?<g1>hello)_[a-z]+_\k<g1>
运行结果如下图:
或者(Ruby 支持)
(?<g1>hello)_[a-z]+_\k'g1'
运行结果如下图:
或者(Ruby 支持)
(?<g1>hello)_[a-z]+_\g<g1>
运行结果如下图:
命名分组的语法:
语法 | 描述 |
(?<name>...) | 命名分组 |
(?name...) | 另一种命名分组的方式 |
(?P<name>...) | Python 中的命名分组 |
\k<name> | 在 Perl 中引用分组名 |
\k'name' | 在 Perl 中引用分组名 |
\g{name} | 在 Perl 中引用分组名 |
\k{name} | 在 .NET 中引用分组名 |
(?P=name) | 在 Python 中引用分组名 |