|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 14 Mar 2007 20:12:40 To : Vladimir Lomov Subject : Re: Поиск и замена с русскими буквами -------------------------------------------------------------------------------- Vladimir Lomov -> Artem Chuprina @ Wed, 14 Mar 2007 14:37:04 +0000 (UTC): VL>>> foreach(<IN_FH>) { VL>>> s/(^\ {$paragraph_indent_num})/\n$1/go; VL>>> VL>>> s/([-\.,!\?'";:>]|\b)\s+([-\.,!\?'";:<]|\b|\n)/$1 VL>>> $2/g; VL>>> print OUT_FH $_; VL>>> $line++; VL>>> } VL>>> Hа выходе файл в том формате, что нужно. Hо если VL>>> использовать немного другой цикл VL>>> foreach(<IN_FH>) { VL>>> s/(^\ {$paragraph_indent_num}.*)\n/\n$1 /go; VL>>> s/(^\w.*)\n/ $1 /; VL>>> VL>>> s/([-\.,!\?'";:>]|\b)\s+([-\.,!\?'";:<]|\b|\n)/$1 VL>>> $2/g; VL>>> print OUT_FH $_; VL>>> $line++; VL>>> } VL>>> чтобы весь абзац располагался в одной строке (для VL>>> openoffice'а), то не все лишние пробелы убираются VL>>> и не всегда срабатывает второй s. Какие-нибудь VL>>> идеи, предложения? AC>> Второй s срабатывает всегда. Возможно, не VL> всегда будет матчиться AC>> написанный там регекс, ну так регекс, который VL> матчится всегда - это AC>> только .* :-) Ты чего имел в виду-то, когда VL> его писал? VL> Для первого варианта: чтобы перед абзацем пустая VL> строка вставлялась. Затем убирались лишние пробелы. VL> Для второго варианта: вставить пустую строку перед VL> абзацем, убрать все символы новой строки для VL> одного абзаца, чтобы поместить его в одну строку. Убрать все символы новой строки - это s/\n//g; Тебе, наверное, надо было не убрать, а заменить на один пробел. Это s/\n/ /g; Hу, для надежности - s/\r?\n/ /g; Впрочем, он там всего один, этот символ, ты ж построчно читаешь. Так что g можно и не писать. А ты что за хрень нарисовал? Правильно, "если строка начинается с буквы, цифры или _, убрать в ней \n и добавить спереди и сзади по пробелу. А если не начинается, то оставить как есть." Это не программирование на ассемблере, это гораздо более высокоуровневая вещь. Для простых операций, как правило, достаточно четко сформулировать то, что ты делаешь, на естественном языке, а потом перевести на обозначения регексов _один в один_. Дополнительные эротические фантазии при этом переводе неуместны. -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru Тормоз - тоже механизм, только медленный совсем. --- ifmail v.2.15dev5.3 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/25606efc8c593.html, оценка из 5, голосов 10
|