在Perl 5中使用多行regexp

时间:2015-06-08 22:02:15

标签: regex perl

我阅读了有关在Perl 5中使用多行正则表达式的手册,但仍然无法弄清楚为什么以下那些不能按预期工作:

#!/usr/bin/perl

use v5.20;

my $s = <<'ENDSTR';
aaa       : AAA
bbb       : BBB
ccc       : CCC
ENDSTR

my $m = 'bbb';

my $a = $s =~ s/.*^$m *: (.*?)$.*/$1/rsm;
my $b = $s =~ s/[.\n]*?^$m *: (.*)$[.\n]*/$1/rm;

print "a: $a\n";
print "b: $b\n";

该计划的预期输出是

a: BBB
b: BBB

但是这些正则表达产生了:

a: BBB
ccc       : CCC

b: aaa       : AAA
bbb       : BBB
ccc       : CCC  

如何纠正这些正则表达式以获得所需的匹配?

3 个答案:

答案 0 :(得分:1)

在perlmonks.org上,我被告知正确的变体:

    var x = (e.clientX - 60) + 'px',
    y = (e.clientY - 40) + 'px'; // Here the 60 should be something to center the tooltip instead

答案 1 :(得分:0)

使用s标志你允许。用于匹配行结尾的元字符。删除它或将正则表达式末尾的。*更改为。*?

答案 2 :(得分:0)

我认为通过\s*:\s*\n拆分该字符串可能更容易。您可以使用输出很容易地构建哈希,但是如果您的一个字符串中有:,而正则表达式中有#!/usr/bin/perl use v5.20; my $s = <<'ENDSTR'; aaa : AAA bbb : BBB ccc : CCC ENDSTR my %hash = split(/(\s*:?\s*|\n)/, $s); say $hash{'bbb'}; ,则此方法将无效。以下代码适用于我:

Config::General

如果您尝试以该格式解析数据,则应尝试使用$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc can parse a simple configuration file format,它与您拥有的http://www.shellhacks.com/en/Encrypt-And-Decrypt-Files-With-A-Password-Using-OpenSSL非常相似,但也支持评论,块和其他很酷的东西