15. Perl 正则表达式-正则捕获 末蓝、 2022-01-29 17:55 510阅读 0赞 正则表达式在匹配过程中,可以通过小括号()对匹配内容进行捕获或分组. ## 1. 捕获变量 ## ### 1.1 引用捕获变量 ### 对于捕获变量的引用分为两种方式, 在匹配模式中, 和匹配模式外. <table> <thead> <tr> <th align="left">引用方式</th> <th align="left">含义</th> </tr> </thead> <tbody> <tr> <td align="left">\n</td> <td align="left">匹配模式中获取捕获的值, 如 m/(a|b)-\1/, 匹配a-a 或b-b</td> </tr> <tr> <td align="left">$n</td> <td align="left">在匹配模式外获取捕获值, 如 s/(a|b)/\U$1/, 将a或b变大写</td> </tr> </tbody> </table> ### 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 内置捕获变量符号 ### <table> <thead> <tr> <th align="left">符号</th> <th align="left">含义</th> </tr> </thead> <tbody> <tr> <td align="left">$`</td> <td align="left">存储匹配内容之前的字符串</td> </tr> <tr> <td align="left">$&</td> <td align="left">存储匹配内容的字符串</td> </tr> <tr> <td align="left">$’</td> <td align="left">存储匹配内容之后的字符串</td> </tr> </tbody> </table> ### 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
还没有评论,来说两句吧...