Perl正则表达式问题

时间:2011-08-07 20:27:30

标签: regex perl

如何在Perl中的$ 1,$ 2和$ 3变量中匹配和存储此字符串中的各行?

$string = "This is a line 1.\nThis is line 2.\nThis is line 3.\n";

我知道我必须使用/ m修饰符,但到目前为止我的尝试都没有成功。

我试过

$string =~ m/^(.*?)$.^(.*?)$.^(.*?)$/sm;

和其他组合无济于事。我想保持简单,所以任何指出错误的答案都会有所帮助。我想只尝试使用/ s和/ m修饰符。

6 个答案:

答案 0 :(得分:6)

为什么要使用$^来匹配中间换行符?

会更简单
$string =~ m/^(.*)\n(.*)\n(.*)/ ;

既没有/ m也没有/ s。甚至只是

($a,$b,$c) = split /\n/,$string ;

答案 1 :(得分:4)

正在进行的是$.被解析为一个变量(它是那些特殊的变量之一;输入文件中的行号):

$. = "foo";
print "matched" if ("foo" =~ m/$./);

解决方法是使用更多语法强制将$解析为(?:$)的正则表达式。但那很难看。我只是直接匹配新行(或使用拆分):

$string =~ m/^(.*)\n(.*)\n(.*)$/;

答案 2 :(得分:2)

我修复了你的正则表达式:

$string =~ m/^(.*?)\n(.*?)\n(.*?)$/sm;

'$'。被视为变量(警告use warnings; use strict;

BTW - 将它们分配给一个数组:

my @list = $string =~ m/^(.*?)\n(.*?)\n(.*?)$/sm;

答案 3 :(得分:1)

my ( $first_line, $second_line, $third_line, $rest_if_any ) 
    = split( /\n/m, $string, 4 )
    ;

答案 4 :(得分:0)

好的,我找到了。被视为变量的$.是线索。我用过:

$string =~ m/^(.*?)$(.)^(.*?)$(.)^(.*?)$/sm;

并打印$1$3$5

谢谢大家。

答案 5 :(得分:0)

如果您想使用变量$1$2$3,可以通过创建一个未将$.视为“{1}}”的正则表达式字符串来执行此操作变量

my $string = "This is a line 1.\nThis is line 2.\nThis is line 3.\n";
my $rex = q/^(.*?)$.^(.*?)$.^(.*?)$/; #The . between $ and ^ is the newline
$string =~ m/$rex/sm;

要表明这是正确的,您可以使用Data::Dumper

use Data::Dumper;
print Dumper($1,$2,$3);

这将输出:

$VAR1 = 'This is a line 1.';
$VAR2 = 'This is line 2.';
$VAR3 = 'This is line 3.';

更进一步,表明了。在$和^之间匹配换行符,您可以添加以下内容:

$rex = q/^(.*?)$(.)^(.*?)$(.)^(.*?)$(.)/;
$string =~ m/$rex/sm;

print Dumper($1,$2,$3,$4,$5,$6);

这将输出:

$VAR1 = 'This is a line 1.';
$VAR2 = '
';
$VAR3 = 'This is line 2.';
$VAR4 = '
';
$VAR5 = 'This is line 3.';
$VAR6 = '
';