如何用Perl提取双引号内的指定字符串存入数组,排除非双引号区域的匹配项
问题原因
你的现有代码存在两个核心问题:
- 正则表达式未匹配
a_b.c后的[数字]后缀,也没有转义.、[这类正则元字符,无法命中目标格式 - 没有限定匹配内容必须被双引号完整包裹,也没有捕获目标字符串的逻辑
正确实现代码
use strict; use warnings; # 存储提取结果的数组 my @target_strings; # 打开文件并增加异常处理 open my $file_handle, '<', 'P2.txt' or die "打开文件失败: $!"; while (my $line = <$file_handle>) { # 全局匹配双引号内的a_b.c[数字]格式字符串 while ($line =~ /\"(a_b\.c\[\d+])\"/g) { # 将捕获到的目标内容存入数组 push @target_strings, $1; } } close $file_handle; # 验证输出(按需使用) foreach my $item (@target_strings) { print $item."\n"; }
正则说明
\"匹配开头的双引号(标记捕获组起始,组内内容就是我们需要的目标字符串a_b\.c\[匹配固定前缀a_b.c[,其中.和[是正则元字符,必须加反斜杠转义才能匹配字面量\d+匹配1个或多个数字,对应[]内的序号\]匹配字面量])标记捕获组结束\"匹配结尾的双引号- 末尾的
g修饰符表示全局匹配,单行内存在多个符合条件的字符串也能全部提取
该实现只会匹配被双引号完整包裹的目标格式字符串,注释中未被双引号包裹的相同内容会被自动排除,符合需求。
内容的提问来源于stack exchange,提问作者Boggarapu Lokesh
相关产品推荐
相关产品推荐

