Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть ли Trim для всей строки, а не для краев?


Страницы:   1 2 3

Kolan ©   (2010-01-22 16:57:00) 

Здравствуйте!

Есть ли встроенная функция для удаления дублирующихся пробелов во всей строке?


Anatoly Podgoretsky   (2010-02-01 12:59:00) [1]


> Дублирующиеся пробелы, Игорь, это когда не одни пробел,
> а несколько. Больше одного то есть.

А можно подряд, или все они в разных местах должны быть?


Ega23   (2010-02-01 12:05:00) [2]


> Дублирующиеся пробелы, Игорь, это когда не одни пробел,
> а несколько. Больше одного то есть.


Про табуляцию не забываем, ага.


Германн   (2010-02-01 00:39:00) [3]


> похоже на C программу вмзуально чисто

Визуально похоже на паскаль.


DVM   (2010-01-31 23:42:00) [4]


> antonn ©

похоже на C программу вмзуально чисто :)


antonn   (2010-01-31 23:37:00) [5]

ну и я накорябаю, функция от Sha :)
procedure Sha_SpaceCompressInplace(var s: string);
var p,q,t:pchar;  ch:char;
label rt;
begin
 UniqueString(s);
 p := pointer(s);
 if p <> nil then begin
  t := p + (pinteger(p - 4))^;
  if p < t then begin
    q := p;
    repeat;
      dec(t);
      if p > t then
        goto rt;
    until (t^ > ' ');
    repeat;
      repeat;
        ch := p^;
        inc(p);
      until ch > ' ';
      repeat;
        q^ := ch;
        ch := p^;
        inc(q);
        inc(p);
      until ch <= ' ';
      q^ := ' ';
      inc(q);
    until p > t;
    dec(q);
    rt: q^ := #0;
    (pinteger(pchar(pointer(s)) - 4))^ := q - pointer(s);
  end;
 end;
end;


DVM   (2010-01-31 23:34:00) [6]


> Игорь Шевченко ©   (31.01.10 22:10) [35]
> DVM ©   (31.01.10 21:48) [34]
>
> Откуда такие шедевры ?

C   http://www.delphidabbler.comя ж написал.


Jeer   (2010-01-31 23:11:00) [7]

Ну шо поделаешь - таки, да.


Игорь Шевченко   (2010-01-31 23:04:00) [8]

Jeer ©   (31.01.10 23:03) [38]

Тема юникода не раскрыта


Jeer   (2010-01-31 23:03:00) [9]

Из незабвенной QString:

function TrimDbl(const S: string; Ch: Char): string;
asm
       PUSH    ESI
       MOV     ESI,ECX
       TEST    EAX,EAX
       JE      @@qt
       MOV     ECX,[EAX-4]
       TEST    ECX,ECX
       JE      @@qt
       PUSH    EBX
       PUSH    EDI
       MOV     EBX,EAX
       MOV     EDI,EDX
       XOR     EDX,EDX
       MOV     EAX,ESI
       CALL    System.@LStrFromPCharLen
       MOV     EDX,EDI
       MOV     ECX,[EBX-4]
       MOV     EDI,[ESI]
@@lp:   MOV     AL,BYTE PTR [EBX]
       MOV     BYTE PTR [EDI],AL
       INC     EBX
       INC     EDI
       CMP     AL,DL
       JE      @@me
@@nx:   DEC     ECX
       JNE     @@lp
@@wq:   MOV     EAX,[ESI]
       MOV     BYTE PTR [EDI],0
       SUB     EDI,EAX
       MOV     [EAX-4],EDI
       POP     EDI
       POP     EBX
       POP     ESI
       RET
@@me:   CMP     DL,BYTE PTR [EBX]
       JNE     @@nx
       INC     EBX
       DEC     ECX
       JNE     @@me
       JMP     @@wq
@@qt:   MOV     EAX,ESI
       CALL    System.@LStrClr
       POP     ESI
end;


Игорь Шевченко   (2010-01-31 22:42:00) [10]

Anatoly Podgoretsky ©   (31.01.10 22:30) [36]

В разумных пределах неважно, сколько ресурсов есть программа, в неразумных - важно.

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

MS кстати, вылизывают свою систему. Или сразу пишут хорошо, но некоторые части все-таки продолжают вылизывать.


> Поэтому в индустрии сейчас такое положение - все побоку,
>  первичен продукт и как можно быстрее.


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


Anatoly Podgoretsky   (2010-01-31 22:30:00) [11]

Ты же сам говорил, что не важно сколько ресурсов в наше время есть программа. И это правильно в общем случае. Пока ты вылизываешь программу, то рынок уже захвачен и денег нет даже на оплату изысков программиста. Едиственная надежда, что программист изначально сразу будет писать идеально, но ведь таких мало. Поэтому в индустрии сейчас такое положение - все побоку, первичен продукт и как можно быстрее.


Игорь Шевченко   (2010-01-31 22:10:00) [12]

DVM ©   (31.01.10 21:48) [34]

Откуда такие шедевры ?

Изумляет не сколько этот шедевр, сколько другое: я полез честно в гугль, посмотреть, а как на других языках подобные проблемы решают (из тех, что я знаю), и офигел. На С с помощью str-функций, на С++ с помощью методов класса CString, на C# с помощью методов типа string и все это в цикле.

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


DVM   (2010-01-31 21:48:00) [13]

вот на http://www.delphidabbler.comнаткнулся на такое и сразу вспомнил эту ветку:

type
 {$IFDEF UNICODE}
 TCharSet = SysUtils.TSysCharSet;
 {$ELSE}
 TCharSet = set of Char;
 {$ENDIF}

function IsCharInSet(const Ch: Char; const Chars: TCharSet): Boolean;
begin
 {$IFDEF UNICODE}
 Result := SysUtils.CharInSet(Ch, Chars);
 {$ELSE}
 Result := Ch in Chars;
 {$ENDIF}
end;

function IsWhiteSpace(const Ch: Char): Boolean;
begin
 Result := IsCharInSet(Ch, [' ', #9, #10, #11, #12, #13]);
end;

function CompressWhiteSpace(const S: string): string;
var
 Idx: Integer;      // loops thru all characters in string
 ResCount: Integer; // counts number of characters in result string
 PRes: PChar;       // pointer to characters in result string
begin
 // Set length of result to length of source string and set pointer to it
 SetLength(Result, Length(S));
 PRes := PChar(Result);
 // Reset count of characters in result string
 ResCount := 0;
 // Loop thru characters of source string
 Idx := 1;
 while Idx <= Length(S) do
 begin
   if IsWhiteSpace(S[Idx]) then
   begin
     // Current char is white space: replace by space char and count it
     PRes^ := ' ';
     Inc(PRes);
     Inc(ResCount);
     // Skip past any following white space
     Inc(Idx);
     while IsWhiteSpace(S[Idx]) do
       Inc(Idx);
   end
   else
   begin
     // Current char is not white space: copy it literally and count it
     PRes^ := S[Idx];
     Inc(PRes);
     Inc(ResCount);
     Inc(Idx);
   end;
 end;
 // Reduce length of result string if it is shorter than source string
 if ResCount < Length(S) then
   SetLength(Result, ResCount);
end;


DVM   (2010-01-23 19:02:00) [14]

А вызывать в цикле StringReplace особенно для длинных строк на мой взгляд неправильно. Слишком много копирований строк туда-сюда. Прооще написать свою функцию, и работать она будет на порядок быстрее.


DVM   (2010-01-23 18:59:00) [15]


> Kolan ©

Нет встроенной.


Andy BitOff   (2010-01-23 18:43:00) [16]

> Kolan ©   (23.01.10 12:24) [19]
> Несомненно, так как в этом случае строчка одна.

В этом случае у тебя 1 + еще 4 тысячи с лишним строчек.
А так ты получишь всего 1 + 5:

function RemoveSpaces(const Str: string): string;
begin
 while AnsiPos('  ', Str) > 0 do
   Result := StringReplace(Str, '  ', ' ', [rfReplaceall])
end;


и вызов

AHistoryList.Text := RemoveSpaces(Answer);


Anatoly Podgoretsky   (2010-01-23 16:55:00) [17]

> Kolan  (23.01.2010 14:52:23)  [23]

А зачем ты сюда пришел?


palva   (2010-01-23 15:54:00) [18]


> Типа как Trim (я ясно выражаюсь?)

Ну теперь яснее. Типа как Trim, как Sqrt или Copy. Что называется типа функции.
А то вопрос был о Trim, который для всей строки, а не краев.
Казалось бы, какое отношение имеет Trim к удалению дублирующихся пробелов, даже на краях.


sniknik   (2010-01-23 15:53:00) [19]

> sniknik, так всю программу можно в строчку вместить :).
только если не больше 255 символов длинной.

> вот именно встроенная, и именно в VCL.
странные у вас ограничения... вот у нас были "не использовать "левых"/сторонних компонент" кроме пары исключений (оправданных), и это были логичные ограничения, т.к. код передавали между филиалами, и чтобы не парится из-за того, что кто-то самовольно решил добавить "красивостей"  в прогу (там где она не нужна)... в общем понятно.
а что за ограничение "не делать собственных функций"??? дальше развиваем "не делать собственных модулей", "не писать программы...".
странно в общем. а вот сторонние использовать можно... еще более странно.


Kolan   (2010-01-23 15:19:00) [20]

turbouser, мне кажется или там еще цикл есть?

А если мне не кажется, то очевидно, когда я захочу воспользоваться этой функцией дважды мне нужно будет оформить её в виде библиотечной, иначе не избежать дублирующегося кода. Так что там целых пять строк.

А мне нужна встроеннаяфункция. Встроенная понимаете? Чтобы одной строкой вызвал, вот так например: AHistoryList.Text := ReplaceRegExpr('\s{2,}', Answer,  #13#10, False);и всё?

Это же элементарно. StringReplace — встроенная, а StringReplace с циклом, интерфейсом и бегин-эндом — это не встроенная, это самодельная. Она конечно сделана из встроенной, но все равно самодельная.

То есть, если не понятно, я хотел у вас узнать есть ли в VCL встроенная функция для удаления пробелов во всей строке или нет.

То есть, вот именно встроенная, и именно в VCL. И чтобы вызывать можно было одной строкой. Типа как Trim(я ясно выражаюсь?), но только для все строки, а не только для краёв.

И чтобы больше ничего не нужно было для её вызова, просто так вот сказал: эй, а УдалиКаМнеВсеПробелы(S)и она — бац и удалила.

И чтобы без цикла, turbouser. И без условий. понимаете Дмитрий? И без крутых названий, MBo. А вот просто встроенная.

Ладно, не важно уже.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо