正则表达式在匹配过程中,可以通过小括号()对匹配内容进行捕获或分组.
对于捕获变量的引用分为两种方式, 在匹配模式中, 和匹配模式外.
引用方式含义\n匹配模式中获取捕获的值, 如 m/(a|b)-\1/, 匹配a-a 或b-b$n在匹配模式外获取捕获值, 如 s/(a|b)/\U$1/, 将a或b变大写捕获变量的存续期指的是到下次值变更的时间.
匹配模式内: 即通过反引号获取的捕获变量\n, 有效期为当前正则表达式中匹配模式外:即通过 符 号 获 取 的 捕 获 变 量 符号获取的捕获变量 符号获取的捕获变量n, 有效期为下次匹配成功.当正则捕获模式过于复杂时, 使用数字可能会产生混淆, 那么可以采用名称进行捕获.
捕获方式: (?匹配模式)引用捕获变量: $+{tagName} $url = "https://blog.csdn.net/zongf0504"; $url =~ /\/\/(?<host>.*)\/(?<user>.*)/; print "host:$+{host}\n"; print "user:$+{user}\n";虽然小括号通常用于捕获匹配到的内容,但是也可以用于分组, 但是并不捕获. 分组可使正则表达式层次更清楚,当然了也可以借助/x 修饰符添加空白符来使层次更清楚.
语法: (?:匹配模式) $url = "https://blog.csdn.net/zongf0504"; # 输出: $1:zongf0504 $url =~ /\/\/(?:.*)\/(.*)/; print "\$1:$1\n"; # 输出:$1:blog.csdn.net $url =~ /\/\/(.*)\/(.*)/; print "\$1:$1\n";在数组上下文中, 会将捕获的所有内容存储到一个数组中.
如果不加修饰符g, 那么只会捕获第一组
$str = "1:AAA 2:BBB 3:CCC"; # 匹配模式转换为哈希 %hash = $str=~ /(\w+):(\w+)/g; @keys = keys %hash; print "$_=$hash{$_}\n" foreach @keys;在列表上下文中,可以用捕获的值对标量赋值.