Perl / regex, чтобы удалить первые 3 строки и последние 3 строки строки - PullRequest
6 голосов
/ 13 августа 2011

Я искал оператор регулярного выражения, чтобы всегда удалять первые 3 строки строки и последние 3 строки строки (средняя часть может содержать любое количество строк n содержимого).Любой чистый способ регулярных выражений, чтобы получить этот вывод?(т.е. всегда удаляйте наши первые 3 строки и последние 3 строки строки - и сохраняйте среднюю часть, которая может быть переменной # строк)

Спасибо.

например

Строка ввода:

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

К требуемой строке вывода:

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

Ответы [ 3 ]

8 голосов
/ 13 августа 2011

Предыдущие решения действительно сложны!Все, что нужно, это

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//;
4 голосов
/ 13 августа 2011

Это должно сработать. Возможно, вам придется заменить «\ 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
0 голосов
/ 13 августа 2011
for($teststring)
{
    s/<.*?>//g;
    $teststring =~ s%^(.*[\n\r]+){3}([.\n\r]).([\n\r]+){3}$%$2%;
    print "Outputstring" . "\n" . $teststring . "\n";
}

Вам нужно проверить, что оно меньше 6 строк и т. Д.

...