![]() |
Модераторы: ginnie |
![]() ![]() ![]() |
|
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
Товарищи, хочу предложить вам жизненную задачу на регулярки:
Задача проста: Нужно обрезать строку до заданной длинны, стараясь по возможности не разбивать слова. В конце строки нужно дописать троеточие (типа "есть продолжение") Требование: 1) результат, вместе троеточием должен быть не длиннее указанной числа символов 2) не разбивать слова, т.е. обрезать предложение нужно между словю 3) между последним словом и троеточием не должно быть пробелов. Я пока решил эту задачу на if - решил не извращаться с регуляркой. Кто сможет написать regexp ? |
|||
|
||||
gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
а что должно получиться?
вот например я делал обрезать длинные слова и длинные строки...
так вот вызвать:
Это сообщение отредактировал(а) gcc - 5.10.2009, 14:49 |
||||
|
|||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
gcc, это регулярка?
Это сообщение отредактировал(а) shamber - 5.10.2009, 15:22 |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
shamber, точно нет...
|
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
должно получиться примерно следующее:
|
|||
|
||||
KSURi |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: нет Всего: 27 |
Легко можно сделать жадный вариант (нарушает п. 1, но на всякий случай):
Это сообщение отредактировал(а) KSURi - 5.10.2009, 19:27 -------------------- Died at Life.pl line 21 |
||||
|
|||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
KSURi, не работает.
видно на 'This is very-very-very-very-very long string. Really long.' |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Вот что я придумал (правда, не только регулярка, плюс к ней еще pos и пробелы в начале строки нужно удалять)
|
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
а почему нельзя написать без регулярки? регулярка быстрее будет?
просто пока это все понапридумывать - так очень много времени тратиться на это |
|||
|
||||
KSURi |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: нет Всего: 27 |
Почему? У меня выводит "This is...". UPD: Нашел пару недочетов, поправил. Вроде не нарушает ниодного пункта.
Это сообщение отредактировал(а) KSURi - 6.10.2009, 08:30 -------------------- Died at Life.pl line 21 |
||||
|
|||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: нет Всего: 40 |
perl -le 'print $ARGV[0] =~ m#^(.{15,24}\S)\b# ? "$1..." : $ARGV[0]'
|
|||
|
||||
Logo |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
А что считать словом? Машинное слово? Тогда:
Что бы развить моск. При тренировке регулярками как правило наоборот, время меньше тратится. Это сообщение отредактировал(а) Logo - 8.10.2009, 13:11 |
||||
|
|||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Logo, а если
$_ = 'This_is_very_very_very_very_very_long_word.'; ![]() |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
amg,
Можно добавить
|
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Не помогает. Все равно длинное слово вырезается полностью. (хотя в условии, строго говоря, не сказано, что такого быть не должно, но исходя из здравого смысла, логично было бы оставлять часть слова).
Кроме того, пусть, например, строка содержит ровно $maxn символов. Твоё решение такую строку обрежет. А логично было бы оставить ее как есть -- она же помещается. И к совсем коротким словам добавит ... Еще одну проверку? (В условии то сказано "только регуляркой". Хотя этого никто пока не смог соблюсти). |
|||
|
||||
Logo |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Ну да, я и поправил только некорректное не обявленное значение переменной.
Верно, и если она меньше $maxn... Сама регуляка только делает "результат, вместе троеточием должен быть не длиннее указанной числа символов". Можно поставить if на длинну строки в коде, хотя и регуляркой тоже можно
|
||||||
|
|||||||
Logo |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Одной регуляркой, и с учетом пожеланий amg. Хотя это уже изврат, наверное
![]()
Хотя на мой взгляд, если разбивать, то не по длине слова, а по длине части слова, оказавшейся целой.
Про это непонял Это сообщение отредактировал(а) Logo - 10.10.2009, 13:54 |
||||||
|
|||||||
ad280379 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
помоему это есть наиболее правильное решение на основе регулярных выражений. единственно не понимаю (т.е. считаю что не правильно) указание \S (вместо \s) и не понятно зачем нижняя граница {15,24} я переписал это так (в данном решении N количество выводимых символов) формат - prg_name.pl N "Hello and welcome dears" результат при N=10 будет "Hello and ..." ---code--- $text = $ARGV[1]; $ltext = length($ARGV[1]); print "[$ltext],[$ARGV[0]],$text" if($text=~m/^(.{0,$ARGV[0]}\s*)\b/ ? ($text="$1...") : ($text.="...")); ---code end--- конструктивная критика приветствуется ![]() |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Очень коротко и аргументировано ![]() |
|||
|
||||
ad280379 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
ну... вы же Бывалый... вообще должны с двух слов понимать |
||||
|
|||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
Господа!
По моему, мы несколько неправильно понимаем задачу. Насколько я себе представляю, она состоит не в том, чтобы написать код, делающий сформулированные в 1-м посте вещи, и даже не в том, чтобы этот код был самым коротким/изящным, а в том, чтобы сделать это только ругуляркой. И такая постановка задачи, IMHO, так пока и не решенной, оправдана. Во-первых, тогда решение будет почти прямо переносимо на любой ЯП, где есть PCRE, во-вторых, существуют программы a'la grep, которым на вход нужно давать регулярное выражение и ничего кроме него. |
|||
|
||||
Logo |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
А как же мой код ![]() |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: нет Всего: 50 |
||||
|
||||
ad280379 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
А как же мой код ![]() ![]() ![]() ![]() |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |