8.х Поиск в строке по определенному паттерну.

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем CSCO12103692, 28 авг 2012.

  1. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Собственно вопрос: возможно ли это? Пока что склоняюсь к мысли, что нет.

    Ситуация: есть некий текстовый файл, он состоит из разного количества, скажем так, сообщений. Каждое сообщение внутри этого файла добавляется в конец, и имеет начальную строку одного формата (меняется только номер, время и еще по мелочи), но тело сообщения имеет разную длину (может быть на одну строку, а может и на 50) и строки бывают разных форматов.

    Чтобы нормально разбирать этот загружаемый файл, нужно разбить в начале его на эти сообщения. И вот тут загвоздка. Простое
    Код:
    Find
    не катит, хедер у каждого свой, а искать маленький кусочек хедера тоже плохо, так как маленький фрагмент может случайно быть в теле сообщения.

    Нужно искать примерно так: сперва идет буква, потом 4 цифры, пробел, несколько букв, цифра, время.......................

    зы
    Этому форуму не хватает ветки в стиле вопрос-ответ. Ради каждой мелочи приходится отдельную тему городить.
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    В запросах используйте ПОДОБНО %ваш шаблон поиска%
  3. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    В смысле в запросах? Я честно говоря не понимаю.

    Есть строка после чтения файла, как там искать по определенной маске?

    И СП про "подобно" ничего не говорит..........
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    ПОДОБНО - используется только в запросах, так что простым кодом вы не сможете воспользоваться.
  5. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Но запросы же используются для извлечения информации из базы данных... при чем тут моя строка???
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    А поиск подстроки не пробовали использовать ???????
  7. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Я не понимаю о чем он.

    В общем все говорит о том, что 1Ска по маске искать не умеет и лечится это только скриптами (пример нашел на просторах инета)

    Код:
    RegExp = Новый COMОбъект("VBScript.RegExp");
    
    RegExp.IgnoreCase = Ложь; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Истина; //Многострочный режим
    
    RegExp.Pattern = "Windows[\w\s\d]*([A-Z1-9]{5}-[A-Z1-9]{5}-[A-Z1-9]{5}-[A-Z1-9]{5}-[A-Z1-9]{5})"; //Ищем ключ Windows
    Matches=RegExp.Execute("строка поиска");
    ЧислоВхождений=Matches.Count();
    Если ЧислоВхождений>0 Тогда
    Для к = 0 По ЧислоВхождений-1 Цикл
    Match = Matches.Item(к);
    SubMatches = Match.SubMatches;
    Ключ=SubMatches.Item(0);
    КонецЦикла;
    КонецЕсли;
    Оригинал:
    http://devtrainingfo...d.jsp?id=567633
    Второй пост
  8. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Посмотрите в СП про функцию Найти(), для строковых типов данных.
  9. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    В первом посте вроде все ясно написано, но я заинтригован ^^

    Хорошо, в разделе"Функции работы со значениями типа Строка" открыл найти().

    И как это должно помочь? Как ты задашь там паттерн?

    зы
    Уж прости что тыкаю, это я не со зла. можешь тыкать в ответ
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Да я не гоню когда мне тыкают, сам могу тыкнуть второй раз, если первый раз дадут:)))))
    Ну подстроку можно формировать "динамически", подставляя необходимые маски.
  11. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Хорошо, предположим паттерн (в моем случае) 24 байта.

    Как ты будешь составлять и прописывать маски для найти(), если значения неизвестны?

    Например первые 5 символов там
    XYYYY где X это буква (хз какая) Y цифра, тоже неизветная. То есть ты знаешь что там в начале будет буква и 4 цифры.

    Привели мне пример маски пожалуйста для этих 5 символов.

    на сколько я понимаю это можно сделать только через задницу задав словарь с буквами и словарь цифрами и поочередно сравнивая каждый символ с ними возвращать там 1 или 0 например (буква или цифра)..........
  12. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Нету регулярных выражений, для подобной задачи можно пойти через COM объект, то что вы нашли, либо комбинация "Найти(<Строка>), Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>)" с проверкой получаемых символов и выход за границы самой строки
  13. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Ааа, теперь догнал что вы хотите:)))))
    Ну в 1С, на встроенном языке, довольно сложно организовать такое
    Если только проверять символ на код, символ это или цифра.
    Возможно есть какие-нибудь сторонние компоненты, я таких не встречал:(
  14. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    О том и речь, в том и печаль :(
    Перебирать всю строку посимвольно с кучей если, или регулярными выражениями как в 7м посте.
  15. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Думаю что алгоритм может уложиться в тоже количество строк, что и через COMОбъект, а там в отдельную функцию и пользуй сколько хочешь.
    Головоломно его будет отладить :)

    Какая разница, что так что эдак вы будете перебирать всю строку. И не будет там кучи "если"
  16. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    может глянуть на полнотекстовый поиск? там самые разные шаблоны для текстового поиска можно использовать..

    только засада в том, что полнотекстовый поиск ищет обЪект, а не строку..

    каждое сообщение - это отдельная строка? тогда можно использовать текстовый документ и обходить документ по строкам..

    приведите кусок лога, который надо разобрать.
  17. TopicStarter Overlay
    CSCO12103692
    Offline

    CSCO12103692 Опытный в 1С

    Регистрация:
    19 июн 2012
    Сообщения:
    190
    Симпатии:
    0
    Баллы:
    26
    Сори, я новичок. Что такое полнотекстовый поиск, где на него можно посмотреть? :)

    зы
    В общем соединив все мысли в голове криво-косо сляпал поиск по маскам в строке средствами 1с
    Код:
    Procedure FindPatterns(String)
    Pattern   = "yxxxx";
    PLength   = StrLen(Pattern);
    Numbers   = "1234567890";
    Letters   = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    MaskedString = "";
    
    For a=1 To StrLen(String) Do
    Symbol = Mid(String,a,1);
    If Find(Numbers,Symbol)>0 Then
    MaskedString = MaskedString+"x";
    ElsIf Find(Letters,Symbol)>0 Then
    MaskedString = MaskedString+"y";
    Else
    MaskedString = MaskedString+"z";
    EndIf;
    EndDo;
    
    While Find(MaskedString,Pattern)>0 Do
    InitNumber = Find(MaskedString,Pattern);
    Result = Mid(String,InitNumber,PLength);
    Message(Result);
    String = Mid(String,initNumber+PLength);
    MaskedString = Mid(MaskedString,initNumber+PLength);
    EndDo;
    EndProcedure
    Основная идея в том, что из исходной строки нужно получить строку маски и уже в ней искать паттерн, то есть строку в которой все символы заменены на соответствия паттерна.
  18. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    _http://v8.1c.ru/overview/fulltext.htm

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