Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обрезать строку до не разбивая слов, до определенной длинны. 
:(
    Опции темы
Logo
Дата 8.10.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

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

Ну да, я и поправил только некорректное не обявленное значение переменной.

Цитата

Кроме того, пусть, например, строка содержит ровно $maxn символов. Твоё решение такую строку обрежет. А логично было бы оставить ее как есть -- она же помещается.

Верно, и если она меньше $maxn... Сама регуляка только делает "результат, вместе троеточием должен быть не длиннее указанной числа символов". Можно поставить if на длинну строки в коде, хотя и регуляркой тоже можно
Код

$maxn = 8;
$n = $maxn - 3;
print "$&..." if m/^(?=.{$maxn}.+$).{0,$n}\b(?=(?:\W|$))/s;


PM MAIL   Вверх
Logo
Дата 10.10.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Одной регуляркой, и с учетом пожеланий amg. Хотя это уже изврат, наверное smile. Разобьет, если на границе слово длинной  7 и более символов. Словом считается [a-z]([a-zа-яё'-]*[a-zа-яё])? ,  т.е. don't и Римский-Корсаков проходят.
Код

$_ ='This is very-very-very-very-very long string. Really long.';
print strip($_, 20);

sub strip {
  my $maxn = pop;
  my $n = $maxn-3;
  return $_[0] =~ m{
  ^.*?
  (?=.{$maxn}.)
  (?:
      ((?=\s* ((?<=.{$n}))? [a-zа-яё] (?:[a-zа-яё'-]){5,} [a-zа-яё] ((?<=..{$n}))) (?(3)(?(2)(?!)|)|(?!)) )|
      (?=\s*[a-zа-яё](?:[a-zа-яё'-]*[a-zа-яё])?(?<=..{$n}))|
      (?<=.{$n})
  )
  (?(1)\s*.*?(?<=.{$n}))
  }xs ? "${^MATCH}..." : $_[0];
}




Цитата

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

Хотя на мой взгляд, если разбивать, то не по длине слова, а по длине части слова, оказавшейся целой.

Цитата

И к совсем коротким словам добавит ... Еще одну проверку? (В условии то сказано "только регуляркой". Хотя этого никто пока не смог соблюсти).

Про это непонял

Это сообщение отредактировал(а) Logo - 10.10.2009, 13:54
PM MAIL   Вверх
ad280379
Дата 2.12.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Цитата(arto @ 6.10.2009,  14:42)
perl -le 'print $ARGV[0] =~ m#^(.{15,24}\S)\b# ? "$1..." : $ARGV[0]'

помоему это есть наиболее правильное решение на основе регулярных выражений.
единственно не понимаю (т.е. считаю что не правильно)  указание \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---


конструктивная критика приветствуется  smile 

PM MAIL   Вверх
Logo
Дата 12.12.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

помоему это есть наиболее правильное решение на основе регулярных выражений.

Очень коротко и аргументировано smile 
PM MAIL   Вверх
ad280379
Дата 12.12.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Цитата(Logo @ 12.12.2009,  22:09)
Цитата

помоему это есть наиболее правильное решение на основе регулярных выражений.

Очень коротко и аргументировано smile

ну... вы же Бывалый... вообще должны с двух слов понимать
PM MAIL   Вверх
amg
Дата 14.12.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Господа!
По моему, мы несколько неправильно понимаем задачу. Насколько я себе представляю, она состоит не в том, чтобы написать код, делающий сформулированные в 1-м посте вещи, и даже не в том, чтобы этот код был самым коротким/изящным, а в том, чтобы сделать это только ругуляркой. И такая постановка задачи, IMHO, так пока и не решенной, оправдана. Во-первых, тогда решение будет почти прямо переносимо на любой ЯП, где есть PCRE, во-вторых, существуют программы a'la grep, которым на вход нужно давать регулярное выражение и ничего кроме него.
PM MAIL   Вверх
Logo
Дата 14.12.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

И такая постановка задачи, IMHO, так пока и не решенной

А как же мой код smile 
PM MAIL   Вверх
amg
Дата 16.12.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(Logo @  14.12.2009,  23:09 Найти цитируемый пост)
А как же мой код
И в самом деле. А я твой код как-то пропустил, т.к. после беглого взгляда на него он у меня не ассоциировался с регулярным выражением (они обычно не так выглядят) smile .

PM MAIL   Вверх
ad280379
Дата 16.12.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 2.12.2009

Репутация: нет
Всего: нет



Цитата(Logo @ 14.12.2009,  23:09)
Цитата

И такая постановка задачи, IMHO, так пока и не решенной

А как же мой код smile

А как же мой код  smile я старался  smile 
 smile  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0891 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.