|
#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; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |