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

0 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 (.*)};'
Run Code Online (Sandbox Code Playgroud)

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

mir*_*rod 12

如前所述,看起来你正在寻找x修饰符.该修饰符忽略regexp中的所有空格,并允许注释(以#开头).

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

$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;
Run Code Online (Sandbox Code Playgroud)

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

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};
Run Code Online (Sandbox Code Playgroud)

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

  • 你通过使用贪婪来获得一个荒谬的回溯量.*每次你使用.*你吞下所有剩下的角色,然后回溯直到你可以完成下一部分.非贪心.*?至少会注意下一个序列.而且我不指望你期待"Steve MarketWatch,MarketWatch LONDON",所以.*?使*显式*你想要留意其余的字符. (6认同)

Ala*_*avi 9

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

来自perldoc perlre:

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