Страница 1 из 2

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

Добавлено: 24 Декабрь 2019, 8:50
Игорь Столяров
Привет всем !

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

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

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

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

Добавлено: 24 Декабрь 2019, 8:55
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)

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 24 Декабрь 2019, 9:58
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 мегабайтов ...

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

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

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

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

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

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

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

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

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

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

Они убрали всё это SystemString

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

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

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

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

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

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

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

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

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

Добавлено: 24 Декабрь 2019, 17:33
finsoftrz
Разработка ABC практически погубила технологию клариона. Это просто мое мнение, не претендующее на истину в последней инстанции.