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

Тема в разделе "Библиотеки скриптов", создана пользователем morpheus, 17 янв 2007.

  1. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Вопрос
    Ответ
    Ниже приведены примеры замены символов в строке

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

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


    Пример 2.
    Код (Text):
    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
    Автор
    oshmianski

    Пример 3.
    Код (Text):
    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
    Автор
    Morpheus
     
  2. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Всё проще гораздо, IMHO.
    Наша рекурсивка:
    Код (Text):
    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 для быстрой конкатенации.
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    LS: Replace function
    Note This function is new with Domino Release 6
    Может раньше и приходилось извращаться, но начиная с 6-й версии есть штатное средство.
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    nvy, Replace нормально работает только когда все 3 параметра - массивы, иначе были красные окошки (наелся их вдоволь, теперь не использую), вот потому люди и "извращаются".
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Странно, как-то не натыкался с этой функцией на "Красный квадрат". Ну, допустим, так, но если с массивами она нормально работает, что мешает написать функцию-обёртку с преобразованием строк в одноэлементные строковые массивы. Как по мне, так это меньший изврат, да и ограничение InStr в таком варианте влиять не должно.
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Для 8-ки уточнение:
    - если все параметры массивы либо все - строки, то работает хорошо;
    - если разнобой в параметрах, например что-то массивы, а что-то - строки, то жди сюрпризов.

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

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

Поделиться этой страницей