Страница 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:39finsoftrz писал(а): 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 практически погубила технологию клариона. Это просто мое мнение, не претендующее на истину в последней инстанции.