0

テキストのブロックを移動するために正規表現を使用していますが、1 行しか削除されません。複数の行を削除するには、何を含める必要がありますか?

4

3 に答える 3

3

あなたはおそらく探している/<!--\[perl\](.*?)-->/s

オプションスイッチを使う/s

文字列を 1 行として扱います。

「。」(ドット) は、改行を含むすべての文字に一致します。

于 2012-06-22T20:28:31.223 に答える
2

正規表現を複数の行にわたって動作させようとするときに、人々をつまずかせることがよくある 2 つのことがあります。

1 つ目は、 or演算子で/sオプションを使用しない限り、正規表現のドットが改行と一致しないという事実です。m//s///

2 つ目は、テキスト ファイルを一度に 1 行ずつ (おそらく を使用してwhile (<$filehandle>) { ... }) 処理している場合、ループを一周するたびに、照合するテキストが 1 行しかないことです。ファイル全体を一度に読み込む必要があります (おそらく を使用$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 に答える