0

我在 Perl 中有匹配正则表达式。超过一行的匹配句子。

我意识到我必须只在一行中输入匹配正则表达式,如果我扩展到多行它会失败:

$array_11 =~ m{By Steve (.*), MarketWatch LONDON (.*) -- Shares of Anglo American rallied on Monday morning as (.*) bet that the mining group will reject a (.*)};'

如果我把它写成多行,它将无法匹配这个字符串。

4

3 回答 3

12

如前所述,看起来您正在寻找 x 修饰符。该修饰符忽略正则表达式中的所有空格,并允许注释(以 # 开头)。

在你的情况下,它有点难看,因为你必须用 []、\s 或 \s+ 替换你想要在正则表达式中匹配的所有空格:

$array_11 =~ m{By \s+ Steve \s+ (.*), \s+
               MarketWatch \s+ LONDON \s+ (.*) \s+
               -- \s+ Shares \s+ of \s+ Anglo \s+ American \s+ 
               rallied \s+ on \s+ Monday \s+ morning \s+ as \s+ 
               (.*) \s+ bet \s+ that \s+ the \s+ mining \s+ 
               group \s+ will \w+ reject \w+ a \w+(.*)
              }x;

所以实际上我可能会写这样的东西:

my $sentence= q{By Steve (.*), MarketWatch LONDON (.*) }
            . q{-- Shares of Anglo American rallied on Monday morning as (.*) }
            . q{bet that the mining group will reject a (.*)}
            ;
my $array_11=~ m{$sentence};

最后一条评论:$array_11有强烈的代码气味,如果它是一个数组,那么让它成为一个数组,而不是几个标量变量。

于 2009-06-22T10:51:17.567 回答
9

您可能正在寻找/x修饰符。

perldoc perlre

x 通过允许空格和注释来扩展模式的易读性。

于 2009-06-22T08:05:38.680 回答
1

所有逃逸的空间都非常丑陋且令人分心。所以,这里有一个替代方案:

my ($pattern) = map { qr/$_/ } join q{ }, split q{ }, <<'EOP';
    Steve (.*), MarketWatch LONDON (.*) --
    Shares of Anglo American rallied on Monday morning
    as (.*) bet that the mining group will \w+ reject
    \w+ a \w+(.*)
EOP

$text =~ $pattern;

注意:我离开了(.*),因为我不知道 OP 想要什么,但请参阅 Axeman 对mirod 回答的评论。

于 2009-06-22T16:42:39.090 回答