Regex 如何在perl中使用替换正则表达式进行交换

Regex 如何在perl中使用替换正则表达式进行交换,regex,perl,Regex,Perl,我有一个类似于 3:12:19 [Sam Peters] user at X 11:1:17 [Roger Fernandes] user at Y 10:9:25 [Harry Dsouza] user at Z 我希望我的输出是 [Peters.S] user at X 3:12:19 [Fernandes.R] user at Y 11:1:17 [Dsouza.H] user at Z 10:9:25 我的代码不起作用。这是我的剧本 #!/usr/bin/perl/ use w

我有一个类似于

3:12:19 [Sam Peters] user at X
11:1:17 [Roger Fernandes] user at Y
10:9:25 [Harry Dsouza] user at Z
我希望我的输出是

 [Peters.S] user at X 3:12:19
 [Fernandes.R] user at Y 11:1:17
 [Dsouza.H] user at Z 10:9:25
我的代码不起作用。这是我的剧本

#!/usr/bin/perl/
use warnings;
use strict;

my $log = "3:12:19 [Sam Peters] user at X \n11:1:17 [Roger Fernandes] user at Y \n10:9:25 [Harry Dsouza] user at Z \n";
print "$log \n";
$log =~ s/ ^
        (.*)     #First group time
        \s                                 #whitespace
        \[                                  #start bracket
           (\w)\s(\w+)                            #name in square barckets
        \]                                  #end brackets
        \s
        (.*)                                #everything else
       $/\[$3\.$2\] $4 $1/gxi;

print "$log \n";

我只是Perl的初学者。我得到的输出与输入相同,没有变化。

在简单的代码示例中,您可以读取数据的每一行,并在每一行上使用此正则表达式:

$line =~ s/(.*) \[(\w)(\w+) (\w+)\] user at (\w+)/\[$4\.$2\] user at $5 $1/;
使用上述数据替换此上的正则表达式示例。

(\w)\s(\w+)
将永远不会与您的“名称”数据匹配<代码>(\w)\w+\s(\w+)有效(前提是没有中间名、首字母缩写和像“Jr.”或“III”这样的结尾)

您对“时间”字段的捕获工作正常,但可以更安全地写成
(\d\d?:\d\d?:\d\d?

$/\[$3\.$2\]$4$1/gxi

无需转义上面的“[]”括号(替换方中的所有内容都被视为普通双引号字符串)。此处不需要
i
修饰符(字符串中没有大小写项。所有匹配项都不需要标识大写/小写字母)。您需要使用
m
修饰符,以便
^和$
在行的开头和结尾(而不是字符串的开头和结尾)匹配(您的
$log
变量是一个包含3行的字符串)

通过这些更改,可以编写替换表达式:

 $log =~ s/^
            (\d\d?:\d\d?:\d\d?) # capture 'time' stamp
            \s                  # space
            \[                  # opening bracket
               (\w)\w+\s(\w+)   # capture first initial and last name
            \]                  # close bracket
            (.+)$               # remaining to end of 'line'
            /[$3.$2]$4$1/mgx;

请你也纠正我的代码中的错误,好吗?请让我更好地学习,不要更改你原来的正则表达式,最好是编辑你的帖子,将你所做的更改(你的第二次尝试)显示为一套全新的代码。谢谢…这很有帮助