[VB6] Регулярные выражения: обёртка для PCRE2 и VBScript.Regexp

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,813
Реакции
6,592
Регулярные выражения: обёртка для PCRE2 и VBScript.Regexp

Создано: Polshyn Stanislav (Dragokas) и Jason Peter Brown (jpbro) при поддержке Tanner_H, oumba, DEXWERX, dilettante (vbforums.com)

PCRE2 - это мощная библиотека регулярных выражений, которая работает очень быстро и поддерживает Perl-совместимый синтаксис регулярок, который более шире, чем включённый в VBScript.Regexp.

Вы можете использовать оригинальную обёртку над PCRE2, написанную Jason Peter Brown: GitHub - jpbro/VbPcre2: PCRE2 Wrapper for VB6

Также мною написана прокси-обёртка, основанная на коде от Jason, которая полностью имитирует объектную модель VBScript.Regexp, и при этом позволяет на лету переключаться между движками VBScript.Regexp и PCRE2.

Основная задача прокси обёртки - автопереключение на движок PCRE2, если поврежден файл библиотеки VBScript.dll или её регистрация.
Но она также имеет и другие преимущества:
  • полностью автономная (единый EXE).
  • легко интегрировать в большой проект, в котором уже повсеместно используется код с вызовами "VBScript.Regexp"
  • не требует регистрации и административных полномочий на машине пользователя

* Добавить cRegExp.cls к проекту
* Поместить файл pcre2-16.dll в ту же папку (или альтернативно, эту dll можно поместить в ресурсы с ID 501 - включено в демо-проект).
* Добавить ссылку на IRegexp.tlb - Project => References... (на машине разработчика при первом запуске нужно открыть IDE от имени администратора)
* Использовать как обычную объектную модель "VBScript.Regexp",
только вместо декларации:

VB.NET / VBA:
Dim oRegexp as Object
set oRegexp = CreateObject("VBScript.Regexp")
использовать такую:
VB.NET / VBA:
Dim oRegexp as IRegExp
set oRegexp = New cRegExp
либо такую:
VB.NET / VBA:
Dim oRegexp as Object
Dim oRegexpProxy as IRegExp
Dim oRegexpProxy = New cRegExp
set oRegexp = oRegexpProxy

Удачи :)
Демо-проект с фейсом есть в папке "Using". Доп. справка - в файлах Readme.md.
Проект в стадии Beta. Нужно жёсткое тестирование. Если найдёте баги, пожалуйста, сообщайте в Issue репозитория GitHub или мне в личку.

Исходный код прокси-обёртки (PCRE2 + VBScript.Regexp): GitHub - dragokas/VbPcre2: PCRE2 Wrapper for VB6

pcre2.png
 

Вложения

  • PCRE2_ProxyWrapper.zip
    922.7 KB · Просмотры: 3
@Flasher, в этом случае вам моя "обертка над оберткой" ни к чему.
Используйте исходную от Jason Peter Brown. Собранный ActiveX Dll уже есть в папке рядом с исходниками.
Не забудьте зарегистрировать через regsvr32

Единственное, что если вам реально хочется юзать методы, которые называются также как и у VBScript.Regexp,
но при этом реально юзать либу PRCE, тогда да, нужен мой враппер интерфейса.
В этом случае, могу попробовать собрать ActiveX Dll. Но работать он будет чуточку медленнее чем jpbro вариант из-за доп. переключений контекста.
 
Последнее редактирование:
@Dragokas, а, у меня она была ещё с 19 года, оказывается. А есть описание по свойствам и методам, прежде всего тем, которых нет в New RegExp? Через объектный браузер ковырять методом тыка как-то не очень.
 
Судя по всему, нету.

Но если посмотреть на реестр, можно увидеть названия регистрируемых объектов:
Код:
VBPCRE2.cPcre2
VBPCRE2.cPcre2Match
VBPCRE2.cPcre2Matches
VBPCRE2.cPcre2Options
VBPCRE2.cPcre2OptionsCompile
VBPCRE2.cPcre2OptionsGeneral
VBPCRE2.cPcre2OptionsMatch
VBPCRE2.cPcre2OptionsReplace

А примеры использования объекта есть здесь.

Полный пример для VBS (на основе примера из ссылки выше):
Код:
Dim lo_RegEx, lo_Matches, ii
set lo_RegEx = CreateObject("VBPCRE2.cPcre2")

With lo_RegEx.Options.Compile
  .CaseSensitive = False
End With

Set lo_Matches = lo_RegEx.Execute("This is a test of matching stuff!", "(test)\s*.+\s*(Mat)")

WScript.Echo lo_Matches.Item(0).SubMatchFirstIndex(0)

If lo_Matches.Count > 0 Then
    For ii = 0 To lo_Matches.Count - 1
        WScript.Echo "Match #" & ii + 1 & ": " & lo_Matches(ii).MatchedText
    Next
Else
    WScript.Echo "No matches found!"
End If

В остальном использование соответствует спецификации на либу PCRE2.
Ну и конечно волшебная F2 (через VBA, например). Если подключить, через референс, будут доступны подсказки в IntelliSense.

1651408771005.png



P.S. Вдобавок можете посмотреть как я юзаю в своём враппере (переменная - mo_PCRE2). Там используется оригинальный код, не ActiveX Dll, но я не думаю что с того времени интерфейс сильно изменился. В целом код основных операций алгоритмически не особо отличается от того же VBScript.Regexp.
 
Последнее редактирование:
... прежде всего тем, которых нет в New RegExp?
По новым, на сколько я вижу, из методов - только Substitute. Описание.

В остальном из нового только опции. Можно более гибко управлять регуляркой.
По каждой опять же найдёте инфу в спецификации. Названия максимально схожи.

По отличиям в целом, PCRE2 принимает гораздо больший набор метасимволов паттерна. Вообщем-то всё, что придумало человечество, доступно :) Например, просмотр вперёд / назад.
Также PCRE2 может вести себя несколько по-другому чем VB-шый регексп. Пример. Но всё это опять же регулируется опциями.
 
Но если посмотреть на реестр ...
... будут доступны подсказки в IntelliSense.
Ну я выше писал про объектный браузер (их несколько), там можно и без регистрации и автозавершения всё увидеть.

А вот за примерчики спасибо. Поковыряюсь. :)

По новым, на сколько я вижу, из методов - только Substitute.
Ещё Option и GlobalSearch.
В остальном из нового только опции.
Наверно, всё-таки свойства. Вот они-то мне и интересны.
По каждой опять же найдёте инфу в спецификации. Названия максимально схожи.
Что-то не получается. Допустим, беру AllowDuplicateSubpatternNames, Anchored, TreatUnknownCapturingGroupsAsEmptyStrings, DotMatchesAllCharacters, Greedy, AllowEmptyClass, DollarMatchesEndOfStringOnly, AlternateCircumflexHandling и т. д. Куда с этим дальше?

По отличиям в целом, PCRE2 принимает гораздо больший набор метасимволов паттерна.
Это-то мне известно. Я же им поэтому и заинтересовался на vbs/js, т. к. нередко применяю в других скриптовых языках и утилитах.
 
Ещё Option и GlobalSearch.
Ну это просто разделение всех опций на группы в иерархии объектов. Под опциями я подразумеваю настройки регулярки вне зависимости от способа их реализации, свойства это или что-то ещё.

Что-то не получается. Допустим, беру AllowDuplicateSubpatternNames, Anchored, TreatUnknownCapturingGroupsAsEmptyStrings, DotMatchesAllCharacters, Greedy, AllowEmptyClass, DollarMatchesEndOfStringOnly, AlternateCircumflexHandling и т. д. Куда с этим дальше?
Вам лучше спросить у автора обёртки или на форуме по Perl.
Я в этой либе так глубоко не разбираюсь и не изучал.
 
Вот названия констант.
По ним можете найти описание в спецификации.
Имена примерно соответствуют названию опции в Dll.
Код:
'Базовые опции
PCRE2_ANCHORED
PCRE2_NO_UTF_CHECK
PCRE2_NOTBOL
PCRE2_NOTEOL
PCRE2_NOTEMPTY
PCRE2_NOTEMPTY_ATSTART
PCRE2_PARTIAL_SOFT
PCRE2_PARTIAL_HARD
PCRE2_ERROR_NOMATCH
PCRE2_SUBSTITUTE_GLOBAL

' Опции Compile
PCRE2_ALLOW_EMPTY_CLASS
PCRE2_ALT_BSUX         
PCRE2_CASELESS         
PCRE2_DOLLAR_ENDONLY   
PCRE2_DOTALL           
PCRE2_EXTENDED         
PCRE2_FIRSTLINE        
PCRE2_MULTILINE        
PCRE2_UNGREEDY         
PCRE2_UTF              
PCRE2_NEVER_BACKSLASH_C
PCRE2_ALT_CIRCUMFLEX   
PCRE2_AUTO_CALLOUT    
PCRE2_DUPNAMES         

' Судя по комментарию в коде - не реализованы
PCRE2_MATCH_UNSET_BACKREF 
PCRE2_NEVER_UCP           
PCRE2_NEVER_UTF           
PCRE2_NO_AUTO_CAPTURE     
PCRE2_NO_AUTO_POSSESS     
PCRE2_NO_DOTSTAR_ANCHOR   
PCRE2_NO_START_OPTIMIZE   
PCRE2_UCP                 

' Опции Substitute
PCRE2_SUBSTITUTE_EXTENDED
PCRE2_SUBSTITUTE_UNSET_EMPTY
PCRE2_SUBSTITUTE_UNKNOWN_UNSET

Например, PCRE2_ANCHORED это опция Anchored
Описание: pcre2_match specification
 
По некоторым особо непонятным свойствам, Jason даже специально делал комментарии, обратите внимание на исходный код.
Например, по ExtendedReplacement очень мощный коммент с примерами.
 
Я в этой либе так глубоко не разбираюсь и не изучал.
Понятно.
По ним можете найти описание в спецификации.
Что-то вижу, но понимаю, что нек. описаний для понимания кодинга недостаточно. Видимо, без метода тыка не обойтись. Примеры Jason посмотрю, спасибо.

P.S.: На др. форуме мы на давно "ты" вообще-то. )
 
Назад
Сверху Снизу