0

我正在使用正则表达式来移动文本块,但它只删除单行 - 为了删除多行,我应该包括什么?

4

3 回答 3

3

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

使用选项开关/s

它将字符串视为单行。

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

于 2012-06-22T20:28:31.223 回答
2

当试图使正则表达式跨多行工作时,有两件事经常使人们绊倒。

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

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

于 2012-06-22T20:59:17.240 回答
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 ;-)";

-->

通过明智地更改输入记录分隔符,您可以确保您读取的每个块都以字符串结尾"-->"。然后,通过向替换运算符提供标志来确保.可以匹配行尾。/s

输出:

<!--[不是]

const char *s = "这不是 Perl ;-)";

-->

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

于 2012-06-23T12:40:37.660 回答