Необходимо в строке заменить кавычки (") на ...

  • Автор темы morpheus
  • Дата начала
M

morpheus

Вопрос
Необходимо в строке заменить кавычки (") на пробелы. Почему-то нашел функцию стандартную для выполнения операции замены только в @-формулах

Ответ
Ниже приведены примеры замены символов в строке

Пример 0.
Код:
StrReplace=Implode(Split(stroka,symbolA),symbolB)
Автор
link removed

Пример 1.
Код:
v = Evaluate({@ReplaceSubstring(org_name;"\"";" ")}, doc)
Автор
link removed


Пример 2.
Код:
Function ChangeInString(source As String, string1 As String, string2 As String, sensitive As Integer) As String
%REM
'source - строка, в которой надо заменить символы
'string1 - символ в source, который надо заменить
'string2 - символ, на который надо заменить string1
'sensitive - CaseAndPitch = 0; PitchNoCase = 1; CaseNoPitch = 4; NoCaseNoPitch = 5

'пример:
'Dim strA As String
'strA = ChangeInString({Oshmianski"ищет"работу}, {"}, " ", 5)
'strA = Oshmianski ищет работу
%END REM
ChangeInString = source
On Error Goto errorhandler	

If string1 = string2 Then
Print "Эта операция не имеет смысла"
Exit Function
End If

While Instr(1, source, string1, sensitive)
source = Left(source, Instr(1, source, string1, sensitive) - 1) + string2 + Mid(source, Instr(1, source, string1, sensitive) + Len(string1))
Wend
ChangeInString = source
ex:
Exit Function
errorhandler:
Print "ChangeInString: " & Error, Erl
Resume ex
End Function
Автор
link removed

Пример 3.
Код:
Function StrReplace(str1 As String, str2 As String, str3 As String)
%rem
Пример использования
If Instr(s1, |"|)>0 Then s1 = StrReplace( Cstr(s1) , |"|, {\"})
%end rem
Dim stroka As String
stroka = str1
Dim i As Integer
i = Instr(stroka, str2)
If i<1 Or Len(str1)<1 Then 
StrReplace = str1
Exit Function
End If

StrReplace = ""
EE1:
i = Instr(stroka, str2)
If i>0 Then
If i-Len(str2)>0 Then
StrReplace = StrReplace + Left(stroka, i-Len(str2))+str3
Else
StrReplace = StrReplace + str3
End If

If Len(stroka) > (i-Len(str2)+1) Then
stroka = Right(stroka, (Len(stroka)-i-Len(str2)+1))
Else
stroka = ""
End If

Goto EE1
End If
StrReplace = StrReplace + stroka
End Function
Автор
link removed
 

VladSh

начинающий
Lotus Team
11.12.2009
1 798
158
BIT
241
Всё проще гораздо, IMHO.
Наша рекурсивка:
Код:
Function ReplaceSubString(pstr As String, sold As String, snew As String) As String
If InStr(1, pstr, sold) Then
ReplaceSubString = Strleft(pstr, sold) + snew + ReplaceSubString(Strright(pstr, sold), sold, snew)
Else
ReplaceSubString = pstr
End If
End Function
Только нужно учитывать, что для больших строк ни одна из этих реализаций не подходит, т.к. у InStr есть лимит... - будет вылетать по ошибке. В таком случае нужен более сложный алгоритм по обработке: либо порциями либо посимвольно с прикручиванием StringBuffer для быстрой конкатенации.
 
N

nvyush

LS: Replace function
Note This function is new with Domino Release 6
Может раньше и приходилось извращаться, но начиная с 6-й версии есть штатное средство.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 798
158
BIT
241
nvy, Replace нормально работает только когда все 3 параметра - массивы, иначе были красные окошки (наелся их вдоволь, теперь не использую), вот потому люди и "извращаются".
 
N

nvyush

nvy, Replace нормально работает только когда все 3 параметра - массивы, иначе были красные окошки (наелся их вдоволь, теперь не использую), вот потому люди и "извращаются".
Странно, как-то не натыкался с этой функцией на "Красный квадрат". Ну, допустим, так, но если с массивами она нормально работает, что мешает написать функцию-обёртку с преобразованием строк в одноэлементные строковые массивы. Как по мне, так это меньший изврат, да и ограничение InStr в таком варианте влиять не должно.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 798
158
BIT
241
Для 8-ки уточнение:
- если все параметры массивы либо все - строки, то работает хорошо;
- если разнобой в параметрах, например что-то массивы, а что-то - строки, то жди сюрпризов.

Также эта функция и другие штатные по работе с массивами плохо переваривают Variant'ы, например в поле с датами заменить какую-нибудь дату..

P.S. Модераторам: надо, наверное почистить эту тему, оставив только первое сообщение, в котором скомпилировать всё, что если в этой ветке.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!