如何在Perl regexp中插入多行?

时间:2012-06-22 20:24:03

标签: perl

我正在使用regexp来移动文本块,但它只删除单行 - 我应该包含哪些内容才能删除多行?

3 个答案:

答案 0 :(得分:3)

您可能正在寻找/<!--\[perl\](.*?)-->/s

使用选项开关/s

它将字符串视为一行。

“”。 (点)将匹配任何字符,包括换行符。

答案 1 :(得分:2)

在尝试使正则表达式跨多行工作时,通常会有两件事情让人兴奋。

首先是正则表达式中的点与换行符不匹配,除非您使用/sm//运算符上的s///选项。

第二个是,如果你一次处理一个文本文件(可能是while (<$filehandle>) { ... }),那么每次循环你只需要一行文本来匹配。您需要立即读取整个文件(可能使用$text = do { local $/; <$filehandle>};)。

答案 2 :(得分:1)

#!/usr/bin/env perl

use strict; use warnings;

{
    local $/ = '-->';
    while (my $chunk = <DATA>) {
        $chunk =~ s/<!-- \[perl\] (.*) --> \z//sx;
        print $chunk;
    }
}

__DATA__
<!--[perl]

my $x = 5;
my $y = 3;
say $x + $y

-->

<!--[not]

const char *s = "This is not Perl ;-)";

-->

通过明智地改变input record separator,您可以确保您阅读的每个块都以字符串"-->"结束。然后,通过向您的替换运算符提供.标志,确保/s可以匹配行结尾。

输出:


<!--[not]

const char *s = "This is not Perl ;-)";

-->

如果重要,您还可以从块中删除前导/尾随空格。