我正在构建一个正则表达式语句,以便始终删除前3个 字符串的行,以及字符串的最后3行(中间部分 可以是任意数量的行内容)。任何干净的正则表达方式来实现 这个输出? (即总是剥离我们的前3行和最后3行 字符串 - 并保留中间部分,可以是变量# ())
感谢。
e.g。
输入字符串:
"
1
2
3
<1...n # of lines content>
4
5
6
"
到所需的输出字符串:
"<1..n # of lines content>"
答案 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行以下等等。