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

Clarion, Clarion 7

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

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

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

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

Привет всем !

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

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

  РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Почему-то помню, что такое добавляли в C10 или собирались добавлять … а найти не могу.
Заранее спасибо ! :)
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение 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)
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4365
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

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

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

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

  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','54-52')
И не хорошо, что есть ограничение по размеру - т.к. результат замены непредсказуем ...
«V» значит Вендетта !

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

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

Ps. Ничего себе девочка с 52 размером. Лифтерша?
Рязань решает.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4365
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

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

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

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

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

Yufil
Ветеран движения
Сообщения: 1174
Зарегистрирован: 16 Май 2006, 13: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
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

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

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

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4365
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

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

Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL … :(
«V» значит Вендетта !

kreator
✯ Ветеран ✯
Сообщения: 3496
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

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

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1337
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

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

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

Они убрали всё это SystemString
Это я только кажусь дураком! На самом деле я полный идиот!

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4365
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

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

Губин Игорь писал(а):
24 Декабрь 2019, 14:43
Они убрали всё это SystemString
Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion … :)
«V» значит Вендетта !

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1337
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

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

Игорь Столяров писал(а):
24 Декабрь 2019, 15:52
Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Но учти, что если используются Легаси, то надо указать в настройках проекта использование библиотек ABC, а если рукописный ввод, то - в параметрах сборки.
Это я только кажусь дураком! На самом деле я полный идиот!

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4365
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

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

Губин Игорь писал(а):
24 Декабрь 2019, 16:22
что если используются Легаси
Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад … ;)
«V» значит Вендетта !

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1337
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

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

Игорь Столяров писал(а):
24 Декабрь 2019, 16:46
Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …
У меня обратная ситуация, полностью отказался от ABC. По мне, так легаси прозрачнее. Дело привычки. А рукописных библиотек без использования шаблонов у меня много...
Это я только кажусь дураком! На самом деле я полный идиот!

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1416
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

Разработка ABC практически погубила технологию клариона. Это просто мое мнение, не претендующее на истину в последней инстанции.
Рязань решает.

Ответить