Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа со строками


Автор: a.S.d 7.3.2005, 01:07
Имеется строка 'some string123' (вместо "some string" может быть что угодно, но "123" постоянно). Как из этой строки сделать строку 'some string'?

Автор: December 7.3.2005, 01:13
Код

result:=copy(str,1,pos('123',str));

Автор: a.S.d 7.3.2005, 01:23
December
Надо так:
Код

result:=copy(str,1,pos('123',str)-1);

Иначе result='some string1'.

Автор: Poseidon 7.3.2005, 03:07
Цитата
Иначе result='some string1'

Это верно! А все из-за того, что роs определяет положение подстроки '123' в строке, а сору позволяет выделить фрагмент строки, длинной как раз токи до первого символа подстроки '123'(в данном случае), т.е. до 1.

Автор: ~FoX~ 7.3.2005, 10:58
ИМХО проще:
Код

result:=copy(str,1, length(str)-3);

Автор: Pakshin A. S. 7.3.2005, 11:54
Код

Delete(str, Length(str)-3, 3);


а что будет быстрее работаеть? smile

Автор: Poseidon 8.3.2005, 04:05
~FoX~
Цитата
result:=copy(str,1, length(str)-3);

будет выдавать то, что ожидается только если 123 в конце строки. А если строка 'some string123abc'? Ведь по предложенному a.S.d условию это не исключается. Поэтому лучше все таки использовать
Цитата
result:=copy(str,1,pos('123',str)-1);
. Так надежней.

PS. Это касается и предложения Pakshin A. S. удалять последние три символа
Цитата
Delete(str, Length(str)-3, 3);
Все хорошо, если эти символы и есть 123, а если нет?

Автор: Alex 8.3.2005, 07:47
a.S.d, а если в строке к примеру два раза встречается 123, то нужно все удалить или нет?

Автор: December 8.3.2005, 16:16
Цитата(a @ 7.3.2005, 01:23)
Надо так:

Угу, лень было думать и проверять smile

Автор: ~FoX~ 9.3.2005, 11:05
Poseidon
Цитата(a @ 7.3.2005, 01:07)
но "123" постоянно


Автор: Poseidon 10.3.2005, 02:34
~FoX~, то, что "123" постоянно, это я видел. Но все равно, предложенное тобой
Код
result:=copy(str,1, length(str)-3);
или
Pakshin A. S.
Код
Delete(str, Length(str)-3, 3);
удаляет последние три символа в строке. А если эти символы не желанные "123"? Допустим строка
Цитата
'some string123abc'

Поэтому эти варианты не приемлемы.

Автор: SlaUr 10.3.2005, 09:21
Может так
Код

While Pos('123',st)>0 do Delete(St,Pos('123',st),3);

Автор: ~FoX~ 10.3.2005, 09:40
Poseidon
Сори, я предыдущий пост не прочитал.......туплю.
Тогда как a.S.d предложил

Автор: Poseidon 11.3.2005, 04:25
Все, я думаю тема исчерпана.
Выводы:
    Если в строке один раз встречается "123", то можно использовать код a.S.d
    Код
    result:=copy(str,1,pos('123',str)-1);

    Если в строке "123" встречается один и более раз, и от этих "123" нужно избавится, то тогда код SlaUr
    Код
    While Pos('123',st)>0 do Delete(St,Pos('123',st),3);

a.S.d, думаю мы тебе тут всем кагалом помогли smile

Автор: Alex 11.3.2005, 09:18
Цитата(Poseidon @ 11.3.2005, 04:25)
Если в строке "123" встречается один и более раз, и от этих "123" нужно избавится

Я обычно пишу:
Код

uses
  StrUtils;
...
  st:= AnsiReplaceText(st, '123', '')

Автор: Poseidon 12.3.2005, 05:18
Alex, раз человек задает такой вопрос, то, я думаю он еще толком не тазобрался со тем, что Delphi предлагает по умолчанию. И что бы еще разбираться, что там за функции есть в StrUtils просто не до этого.

Автор: Alex 12.3.2005, 10:18
Poseidon, в этом и дело, что я сейчас показал ему, что перед тем как задавать вопрос или пытаться самому реализовывать какую-то функцию нужно потратить немного времени и посмотреть, а что Delphi предлагает. Дело в том, что достаточно грамотные и знающие программиста порой не знают о существовании таких нужных и полезных функций. Но их можно понять, эти функции появились в Delphi не так давно, по-моему, начиная с 5 версии. А я в душе человек ленивый и ужасно не люблю изобретать велосипеды я ищу уже написанное стандартное и им пользуюсь (хотя иногда на поиски уходит не один месяц smile ). Многие, к примеру, до сих пор при переводе строки в число или сначала проверяют строку, чтобы в ней были только числа или обрамляют вызов функции try except, а я человек ленивый пользуюсь функцией StrToIntDef и записываю это действие в одну строку, а не в 6.

PS:
А все разговоры, что мы сначала покажем человеку не совсем правильно, но то, что писать легче (эта тема к счастью не этот случай) я ненавижу. Если уж учить так, учить и если показывать пример то самый правильный и может быть самый навороченный, но в нем учтены все подводные камни, о которых вам известно. Дело в том, что, показав один раз человеку легкий, но не совсем правильный код вы делаете этому человеку и еще тем людям, которым этот человек будет теперь уже сам отвечать на подобный вопрос большую гадость. Не совсем правильный код расползается по сети, попадает в FAQ и народ считает его верным. Доказать потом, что этот код не верный и переучить человека писать правильно очень сложно. Поэтому лучше в самом начале дать нормальный качественный пример может быть не совсем простой. Я знаю множество примеров, когда везде в сети лежит один и тот же пример и он не рабочий, но при задании вопроса все упорно копируют его в качестве ответа.

Автор: Poseidon 12.3.2005, 20:14
Alex
Цитата
все разговоры, что мы сначала покажем человеку не совсем правильно, но то, что писать легче
По-моему примеры, каторые были приведены в этой теме не относятся к неправильным. И если прочитать коментарий по этим примерам (тоже в теме), то становится понятно, что получишь, даже не загружая Delphi и не проверяя (в случае, если не разу не встречался с функциями copy, pos, delete). Но вот в чем дело, это хорошо, что есть человек, каторый знает стандартную функцию, а если нет? Я думаю, задав вопрос на форуме, никто не согласится ждать
Цитата
не один месяц
Поэтому и ответы были не "что по-проще", а "что действительно поможет". Но конечно, если дать стандартную функцию, то это будет самый ценный (но не всегда самый хороший, т.к. в большинстве таких случаев люди просто копируют функцию, не разбираясь в том, как она действует) ответ.
Но я думаю, что мы с тобой не будем начинать дискуссию по этому поводу (по крайней мере здесь), т.к. это уже можно опредилить как smile .

PS. А насчет твоего посскриптума, так это ты прав. Это и меня очень раздражает. Я, к примеру, всегда даю код, каторый либо мною написан, либо проверен на ошибки перед этим. Ведь многие только начинают. И напиши в примере кода хотя бы FloadToStr (реальный пример описки в предложенном коде), начинают тебе говорить, что код с ошибкой и не компилируется. А что бы исправить ошибку опыта (пока) не хватает. Поэтому таким людям нужно давать все проверенное, да и еще с //описанием.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)