我在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 (.*)};'
如果我用多行写它,它将无法匹配此字符串。
答案 0 :(得分:12)
如前所述,看起来您正在寻找x修饰符。 该修饰符忽略regexp中的所有空格,并允许注释(以#开头)。
在你的情况下,它有点难看,因为你必须替换所有空格 你想要在[],\ 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
有一个强烈的代码气味,如果它是一个数组,那么使它成为一个数组,而不是几个标量变量。
答案 1 :(得分:9)
答案 2 :(得分: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's answer的评论。