Perl / regex删除字符串的前3行和后3行

时间:2011-08-12 23:01:24

标签: regex perl string-parsing

我正在构建一个正则表达式语句,以便始终删除前3个 字符串的行,以及字符串的最后3行(中间部分 可以是任意数量的行内容)。任何干净的正则表达方式来实现 这个输出? (即总是剥离我们的前3行和最后3行 字符串 - 并保留中间部分,可以是变量# ())

感谢。

e.g。

输入字符串:

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

到所需的输出字符串:

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

3 个答案:

答案 0 :(得分:8)

之前给出的解决方案非常复杂!所有人的需求都是

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//;

答案 1 :(得分: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

答案 2 :(得分:-1)

for($teststring)
{
    s/<.*?>//g;
    $teststring =~ s%^(.*[\n\r]+){3}([.\n\r]).([\n\r]+){3}$%$2%;
    print "Outputstring" . "\n" . $teststring . "\n";
}

你需要测试它是否在6行以下等等。