Замена подстроки в строке

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

Привет всем !

Подскажите пожалуйста, есть ли в Clarion функция замены подстроки в строке ?
Что-то вроде:

Код: Выделить всё

  РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Почему-то помню, что такое добавляли в C10 или собирались добавлять … а найти не могу.
Заранее спасибо ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Замена подстроки в строке

Сообщение finsoftrz »

Код: Выделить всё

FsStrReplace         FUNCTION (Loc:Str,Loc:StrSourse,Loc:StrTarg) ! Объявление процедуры
FilesOpened          LONG
Loc:StrRet           STRING(1024)
  CODE                                            ! Начало исполняемого кода
      if Loc:StrSourse=Loc:StrTarg  !проверка на совпадение исходной и целевой подстроки
         return(Loc:Str)
      .
      Loc:StrRet=Loc:Str
      k#=0
      loop
         p#=instring(Loc:StrSourse,clip(loc:strRet),1,k#+1)
         if p#=0
            break
         .
         Loc:StrRet=sub(loc:strRet,1,p#-1) & Loc:StrTarg & sub(loc:StrRet,p#+len(Loc:StrSourse),len(clip(Loc:StrRet))-p#-len(Loc:StrSourse)+1)
         k#=p#+len(Loc:StrTarg)-1
      .
  
  RETURN(Loc:StrRet)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

Спасибо. У меня тоже есть свой вариант такой функции.
Просто столкнулся с тем, что там возможны рекурсивные замены и решил, может что-то есть готовое.
Точнее помню, что вроде бы оно было … Например, такой вызов:

Код: Выделить всё

  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','54-52')
И не хорошо, что есть ограничение по размеру - т.к. результат замены непредсказуем ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Замена подстроки в строке

Сообщение finsoftrz »

У меня строк длиннее 512 символов практически не бывает, поэтому я не заморачиваюсь. Если нужно, то можно на динамическую строку переделать.

Ps. Ничего себе девочка с 52 размером. Лифтерша?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

finsoftrz писал(а): 24 Декабрь 2019, 9:31У меня строк длиннее 512 символов практически не бывает, поэтому я не заморачиваюсь
Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.
Динамически задавать длину результата тоже не бест. И дело даже не в скорости работы, а в непредсказуемости запроса.
Например:

Код: Выделить всё

  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
И даже если принимаем результат в String(512), то внутри функции этот результат может быть намного больше. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Замена подстроки в строке

Сообщение Yufil »

Для класса CSTR делал метод

Код: Выделить всё

! Replace      Procedure( String, String )

CStr.Replace Procedure( String FromString, String ToString)
LastIndex LONG
               CODE
               LastIndex=1
               LOOP 
                   Index# = INSTRING( FromString, Self.S, 1, LastIndex )
                   IF Index# = 0
                       RETURN
                   ELSE
                      SELF.Set( Self.S[ 1: Index#-1 ] |
                      & ToString |
                      & SELF.S[ Index# + Len( FromString) : Self.Len ] |
                      )
                      LastIndex = Index# + 1 + LEN( ToString )
                 END ! IF 
             END ! Loop 
              Return
S Cstr
....
S.Set( 'Привет, [Name]')
S.Replace( '[Name],'Красавица')

Что-то такое, строка до 80 мегабайтов ...
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Замена подстроки в строке

Сообщение finsoftrz »

Игорь Столяров писал(а): 24 Декабрь 2019, 9:39
finsoftrz писал(а): 24 Декабрь 2019, 9:31У меня строк длиннее 512 символов практически не бывает, поэтому я не заморачиваюсь
Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.
Динамически задавать длину результата тоже не бест. И дело даже не в скорости работы, а в непредсказуемости запроса.
Например:

Код: Выделить всё

  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
И даже если принимаем результат в String(512), то внутри функции этот результат может быть намного больше. :(
Я имел ввиду результат внутри функции. Вариантов нет. Либо просто, быстро, с некоторым разумным ограничением. Либо подольше, посложнее, с динамическим выделением памяти для буфера результата. Выделять память можно кусками, после проверки возможного превышения текущего размера буфера. На этом форуме уже несколько раз мелькали примеры подобного решения.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL … :(
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Замена подстроки в строке

Сообщение kreator »

Игорь Столяров писал(а): 24 Декабрь 2019, 10:28 Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL … :(
Уже, наверно, неактуально. В SQL есть.
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Замена подстроки в строке

Сообщение Губин Игорь »

Игорь Столяров писал(а): 24 Декабрь 2019, 10:28Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL …

Они убрали всё это SystemString
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

Губин Игорь писал(а): 24 Декабрь 2019, 14:43Они убрали всё это SystemString
Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion … :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Замена подстроки в строке

Сообщение Губин Игорь »

Игорь Столяров писал(а): 24 Декабрь 2019, 15:52Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Но учти, что если используются Легаси, то надо указать в настройках проекта использование библиотек ABC, а если рукописный ввод, то - в параметрах сборки.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Замена подстроки в строке

Сообщение Игорь Столяров »

Губин Игорь писал(а): 24 Декабрь 2019, 16:22что если используются Легаси
Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад … ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Замена подстроки в строке

Сообщение Губин Игорь »

Игорь Столяров писал(а): 24 Декабрь 2019, 16:46Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …
У меня обратная ситуация, полностью отказался от ABC. По мне, так легаси прозрачнее. Дело привычки. А рукописных библиотек без использования шаблонов у меня много...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4562
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Замена подстроки в строке

Сообщение finsoftrz »

Разработка ABC практически погубила технологию клариона. Это просто мое мнение, не претендующее на истину в последней инстанции.
C6/C11, ШВС, tps/btrieve.
Ответить