Regex 如何编写一个长正则表达式,使其适合屏幕?

Regex 如何编写一个长正则表达式,使其适合屏幕?,regex,perl,code-formatting,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 (.*)};' 如果我在多行中写入它,它将无法

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

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

您可能正在查找/x修饰符

发件人:

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


如前所述,看起来您正在寻找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;
所以事实上我可能会这样写:

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有很强的代码味道,如果它是一个数组,那么就把它变成一个数组,而不是几个标量变量。

所有的转义空间都很难看,而且让人分心。因此,这里有一个替代方案:

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

为什么要调用标量变量$array_11?您希望这个字符串“模式”有多少独特的组合?使用贪心。*每次使用。*都会得到大量的回溯。您会吞下所有剩余的字符,然后回溯,直到完成下一部分。非贪婪者?至少会注意下一个序列。我不认为你会期待Steve MarketWatch,MarketWatch LONDON,那么?明确表示您希望留心其他角色。过早优化。。。好的,你说得对,我没有真正注意regexp的内容,也许我应该注意!将每个。*替换为。*?这样会更有效率。谢谢。你应该决定。*vs.*?根据你想在模棱两可的情况下匹配的内容,而不是一个更快的情况。@ysth:我想我也指出了这一点,当时我说我怀疑他是否期待Steve MarketWatch的序列。这不仅仅是速度的问题。这是一次精神检查;它只是包含一个速度问题。有点像:从TB_表中选择*是一个设计问题,也是一个优化问题。