2015-11-10 6 views
0

У меня есть сценарий Perl, который работает над дамп базы данных в виде простого текстового файла, пытается удалить все экземпляры строки и, возможно, других нечетных символов, когда я вижу строки между кавычками:Perl Regex удалить символы новой строки в строке

INSERT INTO ... VALUES ("... these are the lines I'm interested in.") 

Я чавкать в файле:

@file = <FILE>; 

и:

foreach my $line (@file) { 
    $line =~ s/"[^"]*(\R)+[^"]*"//g; 
    # I want to get rid of newlines in strings 
    # And other odd characters I might come across 
} 

Один CLAS характер s я использовал вместо (\ R) был:

([\r\n\t\v\f]+) 

и я попытался бы:

$line =~ s/"[^"]+?([\r\n\t\v\f]+)[^"]*"//g; 

Я уверен, что я что-то не хватает. Я пытаюсь начать сопоставлять буквенную двойную кавычку, просканировать мимо ничего, кроме двойной кавычки (не жадное, по крайней мере одно совпадение), добираться до символов, от которых я хочу избавиться, и продолжать сканировать не двойную кавычку (любое количество других символы, а не двойные кавычки), пока я не дойду до конечной двойной кавычки.

Так что я хотел заменить ничьей 1 $ выше.

я пробовал на линии регулярных выражений строителей, и

/"[^"]*?([\r\n\t\f\v]+)[^"]*"/ 

работали с тестом он-лайн, используя короткий абзац с новой строкой и вкладками в нем, хотя он был в режиме PHP PCRE. Я думал, что это сработало бы с Perl.

Возможно, я не избегаю некоторых символов правильно в регулярном выражении для Perl? Или шаблон просто не будет работать так, как я хочу, потому что это неправильно.

Спасибо, любая помощь оценена.

Регулярное выражение в regex101.com:

"[^"]*?([\r\n\f\t\v]+)[^"]*?" 

спичек для строк, как это:

«Это

мой \ т тест

строка

Итак. там!"

Я сейчас полностью озадачен. :)

+0

Не '\ r' просто любой LINEBREAK? Кроме того, между кавычками могут быть непоследовательные строки новой строки и т. Д. Другая проблема заключается в кавычках, сбалансированы ли они в пределах полного ввода? Кажется, вы не ставите себе начало с любым литералом. – sln

+0

Да, \ R - это любой разрыв строки, который я считаю. Я видел несколько таких поисков. Я думаю, что могут быть не последовательные символы новой строки и другие символы, которые я хочу заменить ничем, или просто символ пробела. Как я должен закрепить старт? Вы имеете в виду что-то вроде «,» или «,», которое я ожидаю увидеть перед цитируемой строкой и, возможно, «,» или «) после строки с кавычками? Благодарю. –

+2

Вы вырезали файл в массив, а затем чередуете данные по очереди, но ваше регулярное выражение указывает, что вы хотите совместить многострочную строку. Это не сработает. Вероятно, вам понадобится/нужно будет скопировать файл в скаляр. –

ответ

0

Настоящая проблема заключается в том, что вы найдете только одну группу из \R, когда между кавычками может быть много групп. Лучше всего сделать обратный вызов (eval) с общим совпадением между котировками, а затем заменить \R на
с заменой.

что-то вроде:

sub repl { 
    my ($content) = [email protected]; 
    $content =~ s/\R+//g; 
    return $content; 
} 

$input =~ s/"([^"]*)"/ repl($1) /ge; 

редактировать: Если вы ищете только 1 LineBreak кластера, вы должны
исключить переносы строк, ведущие к нему. Например: [^"\r\n]+

edit2: чавкать файл в $input, сделать

$/ = undef; 
my $input = <$fh>; 
+0

Не совсем уверен в форме eval, хотя 's /// eg' – sln