[РЕШЕНО] Регулярные выражения

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Роман_Н, 11 сен 2014.

  1. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Помогите с РВ.
    Вот текст: «<a href="/resume/af7b8863000214deba0039ed1f34747678324b?query=%D0%A1%D0%B5%D0%BA%D1%80%D0%B5%D1%82%D0%B0%D1%80%D1%8C+-+%D0%98%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BE%D1%80+%D0%BF%D0%BE+%D0%BA%D0%B0%D0%B4%D1%80%D0%B0%D0%BC" class="output__name HH-VisitedResume-Href" itemprop="jobTitle" data-qa="resume-serp__resume-title" rel="nofollow" target="_blank">Инспектор отдела кадров, секретарь, офис-менеджер</a>»


    Мне нужно выдернуть внутренность «Инспектор отдела кадров, секретарь, офис-менеджер». Просмотр назад (?<=) работает в 1С? Вперед (?=) работает .Что-то не получается либо не работает, либо я неправильно пишу…
  2. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.552
    Симпатии:
    716
    Баллы:
    204
    Чую, сморожу глупость, но:
    1. Найти позицию "_blank">"
    2. Найти позицию "</a>»"
    3. Взять то, что между этими позициями.

    Не?
  3. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не совсем понял что нужно.
    Возможно как-то так:
    --- Объединение сообщений, 11 сен 2014 ---
    Если это html страница, то скорее всего не.
    Надо анализировать весь текст страницы. Не факт, что только ссылки с вакансиями заканчиваются на "_blank">".
    Последнее редактирование: 11 сен 2014
  4. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Так возвращается вся строка. А мне нужна строка между > <.
  5. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ?
    regex.PNG
  6. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Кстати: мой вариант
    Код:
    <a href=""/resume/.+?(?=<)
    . Твой выглядит профессиональней)))
  7. TriviumFan
    Offline

    TriviumFan Опытный в 1С Заблокирован

    Регистрация:
    19 мар 2013
    Сообщения:
    92
    Симпатии:
    15
    Баллы:
    29
    Тут тебе нужно зайти на http://htmlbook.ru/html/a и посмотреть, что это за тег и какие у него бывают атрибуты, обязателен ли закрывающий тек и т.д.
    Кажется, тебе нужно так:
    1) найти ">" (конечный символ после всех атрибутов)
    2) найти "</" (т.к. может быть и сокращенный тег закрытия)
    3) взять, то, что между ними
  8. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Именно.
    Сделал через Сред(Строка, позиция > + 1, длина_строки - позиция >)
  9. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Честно говоря сто лет с ними не приходилось работать.

    На каком языке то кстати? Там вроде различия в синтаксисе есть между php и java.
  10. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
  11. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А если не просто свовпадения смотреть, а SubMatches?
    Т.е.
    Код:
    Matches=RegExp.Execute()
    Для каждого Match из Matches Цикл
      SubMatches = Match .SubMatches;
      Для каждого SubMatch из SubMatches Цикл
    ...
  12. TopicStarter Overlay
    Роман_Н
    Offline

    Роман_Н Опытный в 1С

    Регистрация:
    3 июл 2012
    Сообщения:
    291
    Симпатии:
    0
    Баллы:
    26
    Для этого как я понял, РВ должно быть таким, чтобы охватывало весь текст и подходило для его внутренних частей?!
  13. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не совсем понял, что значит "охватывало весь текст". Регулярка и так ведь применяется ко всему тексту, в котором ищутся части подходящие под заданный шаблон.

    В общем вот так вроде работает:
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
        // Вставить содержимое обработчика.
        Шаблон = "<a href[^>]*itemprop=\""jobTitle\""[^>]*>(.*?)<\/a>";
        СтрокаПоиска = "<a href=""/resume/af7b8863000214deba0039ed1f34747678324b?query=%D0%A1%D0%B5%D0%BA%D1%80%D0%B5%D1%82%D0%B0%D1%80%D1%8C+-+%D0%98%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BE%D1%80+%D0%BF%D0%BE+%D0%BA%D0%B0%D0%B4%D1%80%D0%B0%D0%BC"" class=""output__name HH-VisitedResume-Href"" itemprop=""jobTitle"" data-qa=""resume-serp__resume-title"" rel=""nofollow"" target=""_blank"">Инспектор отдела кадров, секретарь, офис-менеджер</a>";
      
        RegExp_Exec(Шаблон, СтрокаПоиска);
      
    КонецПроцедуры
    
    Процедура RegExp_Exec(Шаблон, СтрокаПоиска)
      
        RegExp = Новый COMОбъект("VBScript.RegExp");
      
        RegExp.IgnoreCase = Истина; //Игнорировать регистр
        RegExp.Global = Истина; //Поиск всех вхождений шаблона
        RegExp.MultiLine = Ложь; //Многострочный режим
      
        RegExp.Pattern = Шаблон;
        Matches=RegExp.Execute(СтрокаПоиска);
        ЧислоВхождений=Matches.Count();
        Если ЧислоВхождений>0 Тогда
            Для к = 0 По ЧислоВхождений-1 Цикл
                Match = Matches.Item(к);          
              
                SubMatches = Match.SubMatches;
                ЧислоПодвыражений=SubMatches.Count();
                Для н = 0 По ЧислоПодвыражений-1 Цикл
                    SubMatch=SubMatches.Item(н);
                    Если SubMatch="" Тогда
                        Продолжить;
                    КонецЕсли;  
                  
                    Сообщить("Подстрока: "+SubMatch);
                КонецЦикла;
            КонецЦикла;
        Иначе
            Сообщить("Вхождений шаблона не найдено");
        КонецЕсли;
          
    КонецПроцедуры
    
    Но надо тестировать на большем объеме текста.

    Шаблон чуть сократил, убрал из него поиск по классу, поскольку название класса мне не нравится (output__name HH-VisitedResume-Href), оно может говорить об оформлении уже посещенной ссылки, т.е. не все может войти.
    Роман_Н нравится это.

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