15. Perl 正则表达式-正则捕获

    xiaoxiao2022-07-04  173

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

    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
    最新回复(0)