Страницы: 1
RSS
Использование регулярных выражений в Vba Подключение библитотеки, Ошибка при выполнении метода Execute
 
Воспользовался примером для тастирования регулярных выражений
Код
Sub RegExp_exemple()

Dim myRegExp As New RegExp ' создаем экземпляр RegExp
Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim strTest As String ' тестируемая строка

strTest = "<test>a</test> <test>b</test> <test>c</Test>"

' устанавливаем свойства объекта RegExp
myRegExp.Global = False ' если Global = True, то поиск ведётся во всей строке, _
если False, то только до первого совпадения
myRegExp.IgnoreCase = True ' игнорировать регистр символов при поиске
myRegExp.Pattern = "(?i)<test>(.*?)</test>" ' шаблон для поиска
Set colMatches = myRegExp.Execute(strTest) ' получаем коллекцию совпадений с образцом
'перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ' проходим по всей коллекции
a = aMatch.FirstIndex ' порядковый номер первого символа найденного образца
b = aMatch.Length ' кол-во символов в найденном образце
c = aMatch.Value ' полный образец
Next aMatch

Debug.Print c

End Sub
Подключил библиотеку


При выполнении выдает ошибку.



Пробовал на другой системе, думал, что просто на компьютере какой-то сбой с регистрацией соотвествующей билиотеки, нет тоже самое. В чем может быть дело?

Пробовал менять текст и маску для поиска
Изменено: vcomp71 - 17.09.2018 09:14:12
 
удалите из начала шаблона это: (?i)
могу Вас поздравить! Вам удалось составить шаблон, который завалил RegExp!!!

а на будущее:
при возникновении проблем в работе макроса ищите их причины не где-то вне, а более придирчиво присматривайтесь к тому, что написано внутри вашего макроса - это существенно уменшит время поиска ошибки.
раздумия (медитации) о "кривой регистрации библиотеки", о сбоях в Excel, в Windows, в работе компьютера, о неудачном расположении звезд - все это только отвлекает от поиска проблемы и устранения ее.
Изменено: Ігор Гончаренко - 17.09.2018 09:27:45
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
vcomp71, для отладки шаблона используйте какой-нибудь онлайн-сервис, например https://regexr.com/
Тысячи их!
 
Цитата
Ігор Гончаренко написал:
удалите из начала шаблона это: (?i)могу Вас поздравить! Вам удалось составить шаблон, который завалил RegExp!!!
Текст шаблона взят из помощи по autoit это скриптовый яжык. Там такой шаблон прекрасно работает!


Код
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>

Local $aArray = 0, _
        $iOffset = 1
While 1
    $aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYMATCH, $iOffset)
    If @error Then ExitLoop
    $iOffset = @extended
    For $i = 0 To UBound($aArray) - 1
        MsgBox($MB_SYSTEMMODAL, "RegExp Test with Option 1 - " & $i, $aArray[$i])
    Next
WEnd


Это было для исключения из результатов самой маски, то есть  результат работы скрипта  - соллекция из назначий текста заключенного в тегах
Код
"<test>a</test> <test>b</test> <test>c</Test>"

результат:

'a'
'b'
'c'

А в Vba возвращает
<test>a</test>

АР последующие  вкючения не находятся...
Изменено: vcomp71 - 17.09.2018 13:05:02
 
Цитата
vcomp71 написал:
последующие  вкючения не находятся...
Вы сами написали
Код
myRegExp.Global = False ' если Global = True, то поиск ведётся во всей строке, _
если False, то только до первого совпадения
Цитата
vcomp71 написал:
А в Vba возвращает
Используйте Submatches
Код
myRegExp.Pattern = "<test>(.*?)</test>" ' шаблон для поиска
Set colMatches = myRegExp.Execute(strTest) ' получаем коллекцию совпадений с образцом
'перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ' проходим по всей коллекции
  Debug.Print aMatch.SubMatches(0)
Next aMatch
 
vcomp71, советую использовать позднее связывание типа
Код
Dim myRegExp As Object
Set myRegExp = CreateObject("VBScript.RegExp")
' или
     With CreateObject("VBScript.RegExp")
          ' код
     End With
— это позволит использовать код на компьютерах, у которых не подключена соответствующая библиотека.

Матчасть
Изменено: Jack Famous - 17.09.2018 13:34:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Аалогичный фрагмент с сайта по Java
Код
var data = 'тут текст какой-то <weneeditatt>надо вытянуть</weneeditatt>'
var nov_reg = "<weneeditatt>(.*)</weneeditatt>";
var myAttr = data.match(nov_reg);
Получает текст ИСКЛЮЧАЯ
<weneeditatt> и  </weneeditatt>

Пишут "Нужно оборачивать искомую часть регулярки в скобочки." в VBA так не получается, результат запроса текст ВКЛЮЧАЕТ ограничивающие выражения?

Возвращаясь к моему примеру


Можно потом "доработать напильником" с помощью функции mid,
Код
Sub RegExp_exemple()

Dim myRegExp As New RegExp ' ñîçäàåì ýêçåìïëÿð RegExp
Dim aMatch As Match ' îäèí èç ñîâïàâøèõ îáðàçöîâ
Dim colMatches As MatchCollection ' êîëëåêöèÿ ýòèõ îáðàçöîâ
Dim strTest As String ' òåñòèðóåìàÿ ñòðîêà

strTest = "<test>À âîò òóò òåêñò</test> <test>b</test> <test>c</test>"

' óñòàíàâëèâàåì ñâîéñòâà îáúåêòà RegExp
myRegExp.Global = True ' åñëè Global = True, òî ïîèñê âåä¸òñÿ âî âñåé ñòðîêå, _
åñëè False, òî òîëüêî äî ïåðâîãî ñîâïàäåíèÿ
myRegExp.IgnoreCase = True ' èãíîðèðîâàòü ðåãèñòð ñèìâîëîâ ïðè ïîèñêå

myRegExp.Pattern = "<test>(.*?)</test>" ' øàáëîí äëÿ ïîèñêà

Set colMatches = myRegExp.Execute(strTest) ' ïîëó÷àåì êîëëåêöèþ ñîâïàäåíèé ñ îáðàçöîì
'Set colMatches = myRegExp.Test(strTest)
'ïåðåáèðàåì êîëëåêöèþ è ïðîñìàòðèâàåì ðåçóëüòàòû
For Each aMatch In colMatches ' ïðîõîäèì ïî âñåé êîëëåêöèè
a = aMatch.FirstIndex ' ïîðÿäêîâûé íîìåð ïåðâîãî ñèìâîëà íàéäåííîãî îáðàçöà
b = aMatch.Length ' êîë-âî ñèìâîëîâ â íàéäåííîì îáðàçöå
c = aMatch.Value ' ïîëíûé îáðàçåö

Старт = Len("<test>")
Длина = Len(c)
Конец = Len("/<test>")
c = Mid(c, Страт + 1, Длина - Старт - Конец)

Next aMatch

Debug.Print c

End Sub
Тогда получается искомый текст
но принципиально интересно как это сделать с регулярными выражениями.
Изменено: vcomp71 - 19.09.2018 08:34:10
 
Доброе время суток
Цитата
vcomp71 написал:
var myAttr = data.match(nov_reg);
Получает текст ИСКЛЮЧАЯ
Не получите. Получите массив, где первый элемент - вся найденная подстрока, а вот второй и будет искомым (в VBA это элемент массива SubMatches). Просто наберите код в консоли браузера. Правильно будет для получения значения группы сделать
Код
'тут текст какой-то <weneeditatt>надо вытянуть</weneeditatt>'.match(/<weneeditatt>(.*?)<\/weneeditatt>/)[1]

Плюс, не стесняйтесь подавлять жадность, используя (.*?) вместо (.*)
 
Так и сделал. Вот кусок кода из моего примера
Код
myRegExp.Pattern = "<test>(.*?)</test>" ' øàáëîí äëÿ ïîèñêà
Всё равно пришлось дорабатывать напильноком с помощью функции mid
 
vcomp71, про SubMatches Вам написали уже в #5 и #8. Все не впрок.
 
Цитата
Казанский написал:
vcomp71 , про SubMatches Вам написали уже в #5 и #8. Все не впрок.
Ну это оригинальное решение, кончено. Я имею в виду Microsoft...
 
Цитата
vcomp71 написал:
Ну это оригинальное решение, кончено.
Перевидите... Вы считаете, что SubMatches это не про
Цитата
vcomp71 написал:
Я имею в виду Microsoft...
Может уже почитать RegExp.
Код
Dim pReg As Object, pItems As Object
Set pReg = CreateObject("VBScript.RegExp")
pReg.Pattern = "<test>(.*?)</test>"
Set pItems = pReg.Execute("<test>Какой-то очень нужный текст</test>")
Debug.Print pItems(0).SubMatches(0)
 
В примерах на JavaScript
Код
var data = 'тут текст какой-то <weneeditatt>надо вытянуть</weneeditatt>'
var nov_reg = "<weneeditatt>(.*)</weneeditatt>";
var myAttr = data.match(nov_reg);
и на Autotoit
Код
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
 
Local $aArray = 0,  $iOffset = 1
While 1
    $aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYMATCH, $iOffset)
    If @error Then ExitLoop
    $iOffset = @extended
    For $i = 0 To UBound($aArray) - 1
        MsgBox($MB_SYSTEMMODAL, "RegExp Test with Option 1 - " & $i, $aArray[$i])
    Next
WEnd

Значением возвращаемым функцией является массив элементов с учетом круглых (как их в литературе называют "жадных") скобок. И только в реализации регулярных выражений от Microsoft, возвращается еще и коллекция включающая граничные фрагменты текста. По сути объект содержит ДВЕ коллекции. Это оригинально. На мой взгляд. Впрочем те, кто начал свое знакомство с регулярными выражениями с продукта Microsoft, тот так не считает, вполне допускаю.
Страницы: 1
Наверх