![]() |
|
|
#16
|
||||
|
||||
|
Цитата:
|
|
#17
|
|||
|
|||
|
Волшебным образом, я проверил, мой способ таки работает.
Код:
procedure WordDivider(SL: TStringList);
var
Text: string;
begin
Text := Trim(SL.Text);
Text := StringReplace(text, ' ', ' ', [rfReplaceAll]); // kill all double-space
SL.Delimiter := ' ';
SL.DelimitedText := Text; // divide all Text into words
// sl.Insert(2, ''); // тест работы листа с пустыми строками
end;
// вызов
SL := TStringList.Create;
SL.Text := ' ваша строка с чем угодно';
WordDivider(SL);
for i := 0 to SL.Count - 1 do
ShowMessage(SL[i]); // выводим разбитый на слова текст
sl.Free;Код:
procedure WordDivider(SL: TStringList); begin SL.DelimitedText := SL.Text; // divide all Text into words end; А про стрингреплейс я говорю свою функцию написать - для общих целей, не именно для этих, ибо как показали тесты, схлопывания дубликатов при реплейсе нет, а такая задача может понадобиться (при любом парсинге). И кстати, Вы недалеки по своей интуиции от правды - TList имеет метод Pack для удаления указателей = нил, но стринглист - наследник тстрингс, а не листа ![]() Последний раз редактировалось phomm, 29.04.2014 в 11:10. |
|
#18
|
||||
|
||||
|
Действительно, был не прав по поводу родного StringReplace. Посмотрел исходный код сей функции. У нас с авторами видимо разное представление о флаге rfReplaceAll. Вот первый вариант улучшенной функции StringReplace. Есть в ней один косяк при включенном флаге rfIgnoreCase, тут надо подумать. Но во всем остальном вроде нормально пашет. Если есть замечания, то выкладывайте свой вариант. Будем совместно править косяк Embarcadero
![]() Код:
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
Var LS, RS, Pattern: String;
begin
Result := S;
Pattern := OldPattern;
if rfIgnoreCase in Flags
then begin
Result := AnsiUpperCase(S);
Pattern := AnsiUpperCase(OldPattern);
end;
while Pos(Pattern, Result) <> 0
do begin
LS := Copy(Result, 1, Pos(Pattern, Result)-1);
RS := Copy(Result, Pos(Pattern, Result) + Length(Pattern), Length(Result));
Result := LS + NewPattern + RS;
if not (rfReplaceAll in Flags) then Break;
if Result = S then Break;
end;
end; |