Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
Kolan ©   (2010-01-22 16:57) [0]

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

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


 
turbouser ©   (2010-01-22 17:01) [1]


> Kolan ©   (22.01.10 16:57)  

while AnsiPos("  ", Str)>0 do
 Str:=StringReplace(Str,"  "," ",[rfReplaceall])

и всех делов..


 
Kolan ©   (2010-01-22 17:05) [2]

Почему Ansi? И это не совсем то что я хотел.


 
Игорь Шевченко ©   (2010-01-22 17:21) [3]

Что такое "дублирующиеся пробелы" ?


 
MBo ©   (2010-01-22 17:32) [4]


procedure RemoveTrailingAndStartingSpacesAndZipInnerSpaces(var s: string);
var
 Len, i, j: Integer;
 RemoveSpace: Boolean;
begin
 Len := Length(s);
 j := 0;
 RemoveSpace := True;
 for i := 1 to Len do begin
   if s[i] = " " then
     if RemoveSpace then
       Inc(j)
     else begin
       RemoveSpace := True;
       s[i - j] := s[i];
     end
   else begin
     RemoveSpace := False;
     s[i - j] := s[i];
   end;
 end;
 SetLength(s, Len - j - Ord(RemoveSpace));
end;


 
Игорь Шевченко ©   (2010-01-22 17:54) [5]

MBo ©   (22.01.10 17:32) [4]

Приз за имя


 
Smile   (2010-01-22 18:05) [6]

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

И это не совсем то что я хотел.

Расскажи своей бабушке то, что ты хотел. Возможно она изложит твой вопрос более понятно))


 
KilkennyCat ©   (2010-01-22 18:12) [7]


> MBo ©   (22.01.10 17:32) [4]
>
>
> procedure RemoveTrailingAndStartingSpacesAndZipInnerSpaces(var
> s: string

s как-то скромно. Нужно было назвать "аэтопеременнаячерезкоторуюпередаетсястрокагдебудутудалятьсяпробелы"


 
Германн ©   (2010-01-22 18:17) [8]


> Приз за имя


А такая процедура работала бы лучше!
procedure RemoveTrailingAndStartingSpacesAnd7ZipInnerSpaces


 
clickmaker ©   (2010-01-22 18:21) [9]

> Нужно было назвать "аэтопеременнаячерезкоторуюпередаетсястрокагдебудутуда
> лятьсяпробелы"

var аэтобудетпараметромфункцииRemoveTrailingAndStartingSpacesAndZipInnerSpacesчерезк оторыйпередаетсястрокагдебудутудалятьсяпробелы: string;

аэтобудетпараметромфункцииRemoveTrailingAndStartingSpacesAndZipInnerSpacesчерезк оторыйпередаетсястрокагдебудутудалятьсяпробелы := "что-то    много  тут    пробелов";

аэтострокаужебезпробелов := RemoveTrailingAndStartingSpacesAndZipInnerSpaces(аэтобудетпараметромфункцииRemov eTrailingAndStartingSpacesAndZipInnerSpacesчерезкоторыйпередаетсястрокагдебудуту далятьсяпробелы);

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


 
MBo ©   (2010-01-22 18:25) [10]

>Приз за имя
Самому понравилось ;)


 
Anatoly Podgoretsky ©   (2010-01-22 19:44) [11]

> Kolan  (22.01.2010 17:05:02)  [2]

Еще один недовольный.


 
Kolan ©   (2010-01-23 09:28) [12]

Спасибо ребята, конечно, но задача не решена. Я просил встроенную функцию из VCL или сообщение об её отсутствии.

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

Я, Анатолий, не недоволен, я удивлен ответам.

Smile, лучше я скажу тебе куда тебе пойти.


 
Kolan ©   (2010-01-23 09:30) [13]

Да, тему обсуждение можно закрывать, так как по косвенным признакам очевидно, что такой функции нет.

P. S.
Задачу решил регулярным выражением.


 
KilkennyCat ©   (2010-01-23 09:57) [14]


> очевидно, что такой функции нет.

противоречит

> решил регулярным выражением.


 
Kolan ©   (2010-01-23 09:58) [15]

Регулярные выражения — это сторонний класс.


 
KilkennyCat ©   (2010-01-23 10:43) [16]

В каком смысле? Его отдельно доустанавливать надо? Так и строковые функции многие написаны сторонне, далеко не апишные.


 
Kolan ©   (2010-01-23 11:15) [17]

Да его нужно устанавливать, TRegExpr называется.


 
Andy BitOff ©   (2010-01-23 12:13) [18]

> Kolan ©   (23.01.10 11:15) [17]

Это несомненно лучше, чем написать две строчки кода.


 
Kolan ©   (2010-01-23 12:24) [19]

Несомненно, так как в этом случае строчка одна.


 
sniknik ©   (2010-01-23 12:41) [20]

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


 
Anatoly Podgoretsky ©   (2010-01-23 14:08) [21]

> Kolan  (23.01.2010 09:30:13)  [13]

StringReplace это супер функция, на CompactSpaces


 
Дмитрий Белькевич   (2010-01-23 14:45) [22]

Такая еще есть


function DelSpace1(const S: String): String;
var
I: Integer;
begin
Result := S;
for I := Length(Result) downto 2 do
 if (Result[I] = " ") and (Result[I - 1] = " ") then
  Delete(Result, I, 1);
end;


Правда, неоптимальная по скорости. Но компактная.


 
Kolan ©   (2010-01-23 14:52) [23]

sniknik, так всю программу можно в строчку вместить :).
Я не хочу писать свою реализацию даже из двух строчек.

Что такое CompactSpaces, Анатолий?

Дмитрий, спасибо, но я спрашивал про готовое.

---
Неужели, ребята, вы думаете, что я не в состоянии написать такую функцию и пришел сюда за кодом?


 
turbouser ©   (2010-01-23 14:56) [24]


> Kolan ©   (23.01.10 14:52) [23]


> я спрашивал про готовое.

так StringReplace и есть готовое..


 
Kolan ©   (2010-01-23 15:03) [25]

turbouser, научите меня как оформить вызов, чтобы он съел переменное количество пробелов в середине. Например в такой строке: "I have    no  idea        of how StringReplace   can help me delete all       this  spaces."


 
turbouser ©   (2010-01-23 15:04) [26]


> Kolan ©

[1]


 
Kolan ©   (2010-01-23 15:19) [27]

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

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

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

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

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

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

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

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

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


 
sniknik ©   (2010-01-23 15:53) [28]

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

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


 
palva ©   (2010-01-23 15:54) [29]


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

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


 
Anatoly Podgoretsky ©   (2010-01-23 16:55) [30]

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

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


 
Andy BitOff ©   (2010-01-23 18:43) [31]

> 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);


 
DVM ©   (2010-01-23 18:59) [32]


> Kolan ©

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


 
DVM ©   (2010-01-23 19:02) [33]

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


 
DVM ©   (2010-01-31 21:48) [34]

вот на 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;



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

DVM ©   (31.01.10 21:48) [34]

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

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

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


 
Anatoly Podgoretsky ©   (2010-01-31 22:30) [36]

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


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

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

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

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

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


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


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


 
Jeer ©   (2010-01-31 23:03) [38]

Из незабвенной 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 23:04) [39]

Jeer ©   (31.01.10 23:03) [38]

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


 
Jeer ©   (2010-01-31 23:11) [40]

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
2-1265207702
HF-Trade
2010-02-03 17:35
2010.04.04
GetPixel


15-1263144972
Кто б сомневался
2010-01-10 20:36
2010.04.04
Компенсация одиночества


2-1264944770
Interesting
2010-01-31 16:32
2010.04.04
Количество секунд составляющий временной интервал


6-1215928746
Надуев Алексей
2008-07-13 09:59
2010.04.04
Передача сообщений на другой компьютер


2-1265180253
oleg1963lora
2010-02-03 09:57
2010.04.04
Убрать свойство из класса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский