![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть ли Trim для всей строки, а не для краев?
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. А вот просто встроенная.
Ладно, не важно уже.