我想构建一个正则表达式语句,以始终删除字符串的前三行和最后三行(中间部分可以是任意数量的行内容)。有没有干净的正则表达式方式来实现这个输出?(即始终从字符串中剥离出前3行和后3行,并保留可能有变量数量的中间部分行)
谢谢。
例如:
输入字符串:
"
1
2
3
<1...n # of lines content>
4
5
6
"
需要的输出字符串:
"<1..n # of lines content>"
我想构建一个正则表达式语句,以始终删除字符串的前三行和最后三行(中间部分可以是任意数量的行内容)。有没有干净的正则表达式方式来实现这个输出?(即始终从字符串中剥离出前3行和后3行,并保留可能有变量数量的中间部分行)
谢谢。
例如:
输入字符串:
"
1
2
3
<1...n # of lines content>
4
5
6
"
需要的输出字符串:
"<1..n # of lines content>"
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//;
这应该能解决问题。你可能需要根据输入字符串的换行格式将"\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
for($teststring)
{
s/<.*?>//g;
$teststring =~ s%^(.*[\n\r]+){3}([.\n\r]).([\n\r]+){3}$%$2%;
print "Outputstring" . "\n" . $teststring . "\n";
}
[\n\r]+
可以匹配任意数量的换行符。最好先将行尾转换为本地操作系统的格式,而不是试图允许任何组合的\r和\n。 - DavidO