Modber Сообщество
профессионалов по 1С

Решение проблемы с многострочным режимом в VBScript.RegExp



Платформы: 1С:Предприятие 8.3
Конфигурации: Все конфигурации
2013-07-12
2439 
inc
1  
Здравствуйте все! Недавно, решила создать средство для поиска, теста и замены подстрок при помощи регулярных выражений которая доступна в 1С. Но к сожалению, после написания, обнаружила что многострочный режим у меня некорректно работает в VBScript.RegExp. Вот лог кода с нерабочим многострочным режимом:

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);
            КонецЦикла;    
        КонецЦикла;
    Иначе
        Сообщить("Требуемых вхождений по вашему запросу не найдено ");
    КонецЕсли;


По окончанию возвращает "Требуемых вхождений по вашему запросу не найдено ". Но если не использовать перевод строки то все работает на "ура". Так что я обратилась к тем кто разбирается в данном вопросе и попросила совета. В итоге с их помощью все решилось.Первым делом мне посоветовали изменить egExp.Globale на RegExp.Globale=-1, но это не дало никаких результатов. Потом, пробовала использовать такое выражение:
Выражение = "Выпить(\W*)сока"; что тоже не принесло результатов. В итоге, я использовала регулярное выражение вот такого вида:
Выражение = Выпить((.|\n)*?)сока
где в VBScript.RegExp:
"." — абсолютно любой символ на выбор, кроме перевода строки  
"|" — означает метасимвол "ИЛИ"
"\n" — перевод строки
"*" — тоже любой символ который имеет свойство повторятся 0 или больше раз
"?" — убирает жадность
После изменения регулярного выражения многострочный режим начал нормально работать. Вот и все. Надеюсь чем то смогла Вам помочь. Спасибо за внимание.



Бесплатная юридическая
консультация по телефону

8 (499) 350-80-26(Москва)
8 (812) 627-15-62(Спб)

звонок бесплатный

В центре внимания

Комментарии (2)