6

文字列の最初の 3 行と文字列の最後の 3 行を常に削除する正規表現ステートメントを作成しようとしていました (中間部分は任意の n 行のコンテンツである可能性があります)。この出力を達成するためのきれいな正規表現の方法はありますか? (つまり、常に文字列の最初の 3 行と最後の 3 行を削除し、中間部分を保持します。これは可変の行数になる可能性があります)

ありがとう。

例えば

入力文字列:

"
1
2
3
<1...n # of lines content>
4
5
6
"

目的の出力文字列へ:

"<1..n # of lines content>"
4

3 に答える 3

9

以前に与えられた解決策は本当に複雑です!必要なのは

s/^(?:.*\n){1,3}//;
s/(?:.*\n){1,3}\z//;

最後に末尾の改行がないことを受け入れたい場合は、次を使用できます。

s/\n?\z/\n/;
s/^(?:.*\n){1,3}//;
s/(?:.*\n){1,3}\z//;

また

s/^(?:.*\n){1,3}//;
s/(?:.*\n){0,2}.*\n?\z//;
于 2011-08-13T00:09:05.840 に答える
4

これでうまくいくはずです。入力文字列の改行形式によっては、「\n」を「\r\n」に置き換える必要がある場合があります。これは、最後の行が改行で終了しているかどうかに関係なく機能します。

$input = '1
2
3
a
b
c
d
e
4
5
6';

$input =~ /^(?:.*\n){3} ((?:.*\n)*) (?:.*\n){2}(?:.+\n?|\n)$/x;

$output = $1;

print $output

出力:

a
b
c
d
e
于 2011-08-13T00:03:16.857 に答える
-1
for($teststring)
{
    s/<.*?>//g;
    $teststring =~ s%^(.*[\n\r]+){3}([.\n\r]).([\n\r]+){3}$%$2%;
    print "Outputstring" . "\n" . $teststring . "\n";
}

6行未満かどうかなどをテストする必要があります。

于 2011-08-12T23:58:39.787 に答える