Воспользовался примером для тастирования регулярных выражений
Код
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
Подключил библиотеку
При выполнении выдает ошибку.
Пробовал на другой системе, думал, что просто на компьютере какой-то сбой с регистрацией соотвествующей билиотеки, нет тоже самое. В чем может быть дело?
удалите из начала шаблона это: (?i) могу Вас поздравить! Вам удалось составить шаблон, который завалил RegExp!!!
а на будущее: при возникновении проблем в работе макроса ищите их причины не где-то вне, а более придирчиво присматривайтесь к тому, что написано внутри вашего макроса - это существенно уменшит время поиска ошибки. раздумия (медитации) о "кривой регистрации библиотеки", о сбоях в Excel, в Windows, в работе компьютера, о неудачном расположении звезд - все это только отвлекает от поиска проблемы и устранения ее.
myRegExp.Pattern = "<test>(.*?)</test>" ' шаблон для поиска
Set colMatches = myRegExp.Execute(strTest) ' получаем коллекцию совпадений с образцом
'перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ' проходим по всей коллекции
Debug.Print aMatch.SubMatches(0)
Next aMatch
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
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 написал: var myAttr = data.match(nov_reg); Получает текст ИСКЛЮЧАЯ
Не получите. Получите массив, где первый элемент - вся найденная подстрока, а вот второй и будет искомым (в VBA это элемент массива SubMatches). Просто наберите код в консоли браузера. Правильно будет для получения значения группы сделать
Код
'тут текст какой-то <weneeditatt>надо вытянуть</weneeditatt>'.match(/<weneeditatt>(.*?)<\/weneeditatt>/)[1]
Плюс, не стесняйтесь подавлять жадность, используя (.*?) вместо (.*)
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)
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, тот так не считает, вполне допускаю.