15. Perl 正则表达式-正则捕获[亲测有效]

(18) 2023-03-26 13:03

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说15. Perl 正则表达式-正则捕获[亲测有效],希望能够帮助你!!!。

正则表达式在匹配过程中,可以通过小括号()对匹配内容进行捕获或分组.

1. 捕获变量

1.1 引用捕获变量

对于捕获变量的引用分为两种方式, 在匹配模式中, 和匹配模式外.

引用方式 含义
\n 匹配模式中获取捕获的值, 如 m/(a|b)-\1/, 匹配a-a 或b-b
$n 在匹配模式外获取捕获值, 如 s/(a|b)/\U$1/, 将a或b变大写

1.2 捕获变量的存续期

捕获变量的存续期指的是到下次值变更的时间.

  • 匹配模式内: 即通过反引号获取的捕获变量\n, 有效期为当前正则表达式中
  • 匹配模式外:即通过 符 号 获 取 的 捕 获 变 量 符号获取的捕获变量 n, 有效期为下次匹配成功.

2. 命名捕获

当正则捕获模式过于复杂时, 使用数字可能会产生混淆, 那么可以采用名称进行捕获.

  • 捕获方式: (?匹配模式)
  • 引用捕获变量: $+{tagName}
$url = "https://blog.csdn.net/zongf0504";

$url =~ /\/\/(?<host>.*)\/(?<user>.*)/;

print "host:$+{host}\n";
print "user:$+{user}\n";

3. 分组(不捕获)

虽然小括号通常用于捕获匹配到的内容,但是也可以用于分组, 但是并不捕获. 分组可使正则表达式层次更清楚,当然了也可以借助/x 修饰符添加空白符来使层次更清楚.

  • 语法: (?:匹配模式)
$url = "https://blog.csdn.net/zongf0504";

# 输出: $1:zongf0504
$url =~ /\/\/(?:.*)\/(.*)/;
print "\$1:$1\n";

# 输出:$1:blog.csdn.net
$url =~ /\/\/(.*)\/(.*)/;
print "\$1:$1\n";

4. 自动捕获变量

4.1 内置捕获变量符号

符号 含义
$` 存储匹配内容之前的字符串
$& 存储匹配内容的字符串
$’ 存储匹配内容之后的字符串

4.2 测试

$str = "http://www.baidu.com";
$str =~ /www/;

# 输出: 匹配前的字符串: http://
print "匹配前的字符串: $`\n"; 

# 匹配到的字符串: www
print "匹配到的字符串: $&\n";

# 匹配后的字符串: .baidu.com
print "匹配后的字符串: $'\n";

5. 捕获上下文

5.1 数组上下文

在数组上下文中, 会将捕获的所有内容存储到一个数组中.

5.1.1 示例脚本

$str = "1:AAA 2:BBB 3:CCC";

# 匹配模式转换为数组
@array = $str=~ /(\w+):(\w+)/g;

print "array: @array\n";

5.1.2 脚本输出

array: 1 AAA 2 BBB 3 CCC

5.2 哈希上下文

5.2.1 示例

如果不加修饰符g, 那么只会捕获第一组

$str = "1:AAA 2:BBB 3:CCC";

# 匹配模式转换为哈希
%hash = $str=~ /(\w+):(\w+)/g;

@keys = keys %hash;
print "$_=$hash{$_}\n" foreach @keys;

5.2.2 脚本输出

2=BBB
1=AAA
3=CCC

5.3 列表上下文

在列表上下文中,可以用捕获的值对标量赋值.

5.3.1 示例

$str = "root:123456";
($user, $pwd) = $str =~ /(\w+):(\w+)/;

print "user:$user\n";
print "pwd:$pwd\n";

5.3.2 脚本输出

user:root
pwd:123456

上一篇

已是最后文章

下一篇

已是最新文章

发表回复