Like

Тема в разделе "Lotus - Программирование", создана пользователем VladSh, 8 окт 2010.

  1. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Вроде на простейших вещах, а иногда высаживает... ) ;)

    Хочется определить, есть ли в строке одинарный слэш или нет. В строке могут быть и двойные и тройные, но определить надо наличие именно одинарного.
    т.е. чтобы в такой строке вернуло True:
    pStr = "dfff\s\dg\\fg\\\fsg\\fsh\sdfg\sdfg\\"
    а в такой False:
    pStr = "dfffsdg\\fg\\\fsg\\fshsdfgsdfg\\"

    Думал, что алгоритм должен быть такой:
    - найти слэш и посмотреть следующий символ, который может быть любым но ни слэшем;
    - ну а лучше было бы взять слэш и посмотреть с обоих сторон, чтобы не было слэшей.

    По первому варианту пробовал так:
    pStr Like "*\[!\]*"
    так:
    pStr Like "*\[!\\]*"
    и так:
    pStr Like "*\[!-\]*"
    и ещё, Бог знает, как )))
    ничего не получается.
    Вернее он определяет слэш вообще, а не одинарный..

    Что подскажет сообщество? :)
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    эм, как на счет разбить строку на массив (split) и проверить на пустые элементы? :)
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    like наредкость глюкавый оператор...
    LS2J и регулярки :)
     
  4. Darker

    Darker Гость

    Akupaka +1

    Или вот еще идея,
    Код (Text):
    temp=Replace("123//1243/123///12323////","//","^")
    temp=replace(temp,"^/","")
    isHaveSlash=(instr(temp,"/")>0)
    или для параноиков))
    Код (Text):
    isHaveSlash=(instr(Replace(Replace("123//1243/123///12323////","//","^"),"^/",""),"/")>0)
     
  5. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Это да... Только не хочется из-за такой мелочи ещё и Яву тянуть.

    Darker, хороший для логики вариант, сам когда-то такими вещами извращался, но уж многовато телодвижений.. :rolleyes:

    Ребята, всем спасибо, возьму вариант:
     
  6. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    лимиты варианта со split в 6ке(8ки ща нет под рукой) - Note Fixed-length strings, strings in variants, and random files will not work with strings greater than 64K in length because they have a two-byte header which contains the length of the string. Two bytes cannot represent more than 64K.
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    (pStr Like "*[!\][\][!\]*") Or (pStr Like "[\][!\]*") Or (pStr Like "*[!\][\]")
     
  8. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    гм.. пустые элементы будут и когда просто двойные и тройные и когда одинарные с двойными и тройными...


    Грустно, потому накропал:
    Код (Text):
    %REM
    Function IsSlashContains
    Description: проверка наличия одинарного слэша
    %END REM
    Function IsSlashContains(sSource As String) As Boolean
    Const SMB_SLASH = "\"
    lSource% = Len(sSource)

    pSmb% = 1
    Do
    pSmb% = InStr(pSmb%, sSource, SMB_SLASH)
    If pSmb% = 0 Then Exit Function

    For nSlash% = 1 To lSource%
    If pSmb% = lSource% Then
    If nSlash% = 1 Then Exit Do Else Exit Function
    End If

    pSmb% = pSmb% + 1

    If Mid$(sSource, pSmb%, 1) <> SMB_SLASH Then
    If nSlash% = 1 Then Exit Do Else Exit For
    End If
    Next
    Loop

    IsSlashContains = True
    End Function
    Medevic
    Подтверждаете, что слухи о глюкавости немного преувеличены, видимо надо просто уметь готовить ))

    По теме: решение классное, но
    все выражения для pStr = "\" вычисляются в False.
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    VladSh мы ща допилим костылей и для этого случая ;))))
    (pStr ="\") or (pStr Like "*[!\][\][!\]*") Or (pStr Like "[\][!\]*") Or (pStr Like "*[!\][\]")
     
  10. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Да, это решение для строки больше 1-го символа. Нужна еще одна проверка pStr = "\". ;)
     
  11. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Medevic
    Всё равно спасибо! Думаю, всем будет полезно для изучения Like ;)
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    наскока помню like адекватен для Ascii (и то - тока для печатных символов)
    а про привлечение java - не понимаю, что смущает?
    скорость исполнения, сомневаюсь, что в выше перечисленных вариантах она "лучше" :)
     
  13. VladSh

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

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    lmike
    Я не тестировал, но мне почему-то кажется (возможно я и ошибаюсь), что на подключение (LS2J) тратится время.
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    как и на всякую процедуру инициализации :)
    но если оформить в виде класса и инициализировать в библе - не вижу ничего "страшного"
    а вот тормоза в реализации стринговых операций в LS - известный момент
     
Загрузка...
Похожие Темы - Like
  1. skyman
    Ответов:
    0
    Просмотров:
    4.250

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