通过正则表达式替换的字符串不起作用

问题描述 投票:0回答:1

我有一些 Perl 程序来检查日志文件并打印使用特定正则表达式模式找到的行。

到目前为止,这有效。

现在我想扩展程序,不仅找到模式,而且找到后更改消息。

我做了一个简化的例子:

my $av_tmp_LOGSTRING = "PACKET_INFO: Dst: 192.168.0.1:123 {router}, Src: 192.168.0.1:44701 (UDP): connection refused";
my $av_tmp_PATTERN = 'PACKET_INFO: Dst: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d{1,5} \{router\}, (Src: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})):\d{1,5} \(UDP\): connection refused';
if ( $av_tmp_LOGSTRING =~ m/$av_tmp_PATTERN/p )
{
  print ${^PREMATCH}, "\n";
  print ${^MATCH}, "\n";
  print ${^POSTMATCH}, "\n";
}

这个效果很好。在字符串中找到模式并打印。

现在通过 preplace 操作进行扩展!

my $av_tmp_LOGSTRING = "PACKET_INFO: Dst: 192.168.0.1:123 {router}, Src: 192.168.0.1:44701 (UDP): connection refused";
my $av_tmp_PATTERN = 'PACKET_INFO: Dst: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d{1,5} \{router\}, (Src: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})):\d{1,5} \(UDP\): connection refused';
if ( $av_tmp_LOGSTRING =~ m/$av_tmp_PATTERN/p )
{
  print ${^PREMATCH}, "\n";
  print ${^MATCH}, "\n";
  print ${^POSTMATCH}, "\n";
}
my $av_tmp_REPLACE = 'aaa \g{1}';
$av_tmp_LOGSTRING =~ s/$av_tmp_PATTERN/$av_tmp_REPLACE/e;
print $av_tmp_LOGSTRING, "\n";

打印:

aaa\g{1}

预计:

aaa 192.168.0.1

任何提示都表示赞赏我的错误所在。

regex perl
1个回答
0
投票

将替换字符串更改为:

my $av_tmp_REPLACE = "aaa $1";
© www.soinside.com 2019 - 2024. All rights reserved.