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 回答