Подскажите пожалуйста, есть ли в Clarion функция замены подстроки в строке ?
Что-то вроде:
Код: Выделить всё
РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Заранее спасибо !
Модератор: Дед Пахом
Код: Выделить всё
РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Код: Выделить всё
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)
Код: Выделить всё
РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','54-52')
Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.
Код: Выделить всё
РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
Код: Выделить всё
! 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
Я имел ввиду результат внутри функции. Вариантов нет. Либо просто, быстро, с некоторым разумным ограничением. Либо подольше, посложнее, с динамическим выделением памяти для буфера результата. Выделять память можно кусками, после проверки возможного превышения текущего размера буфера. На этом форуме уже несколько раз мелькали примеры подобного решения.Игорь Столяров писал(а): ↑24 Декабрь 2019, 9:39Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.
Динамически задавать длину результата тоже не бест. И дело даже не в скорости работы, а в непредсказуемости запроса.
Например:
И даже если принимаем результат в String(512), то внутри функции этот результат может быть намного больше.Код: Выделить всё
РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
Уже, наверно, неактуально. В SQL есть.Игорь Столяров писал(а): ↑24 Декабрь 2019, 10:28 Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL …
Игорь Столяров писал(а): ↑24 Декабрь 2019, 10:28Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL …
Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Но учти, что если используются Легаси, то надо указать в настройках проекта использование библиотек ABC, а если рукописный ввод, то - в параметрах сборки.Игорь Столяров писал(а): ↑24 Декабрь 2019, 15:52Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …
У меня обратная ситуация, полностью отказался от ABC. По мне, так легаси прозрачнее. Дело привычки. А рукописных библиотек без использования шаблонов у меня много...Игорь Столяров писал(а): ↑24 Декабрь 2019, 16:46Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …