如何编写长正则表达式以使其适合屏幕?

时间:2009-06-22 07:55:05

标签: regex perl code-formatting

我在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 (.*)};'

如果我用多行写它,它将无法匹配此字符串。

3 个答案:

答案 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)

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

来自perldoc perlre

  

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

答案 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的评论。