Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual Basic: Общие вопросы > VBScript и регулярные выражения


Автор: nil5 03.07.07, 12:17
Первый раз использую vbs. Прошу сразу заметить, что не VB для которого есть проекты в студии и который компилится, а именно скриптовый vbs.
Код приходится набирать в блокноте :(
После чего это код встраивается в МОМ. Так вот, скрипт парсит строку, я решил для это использовать регулярные выражения, дабы работал уже с ними в perl.

Попробовал сделать следующие

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Parameter12 = ~m/BatteryInfoAvaible\s*=\s*(\d);/
    Set BatteryInfoAvaible = $1;


Не вышло. После чего полез в инет, где все пишут об библиотеке выражений для VB, которую подключать надо через студию. Я так понимаю для меня это не подходит. Подскажите как правильно использовать выражения в vbs.

Автор: ANDLL 03.07.07, 12:23
Класс VBScript_RegExp_55.RegExp
Аля
Set A=Createobject("VBScript_RegExp_55.RegExp")
и далее использовать ровно также как будто он подключен через студию

Автор: nil5 03.07.07, 12:24
Круто!!! Сейчас попробую.

Автор: MIF 03.07.07, 12:34
Я бы посоветовал отладку кода делать в ВБ, а потом переносить в ВБС.
Это позволит при отладке использовать early binding, intellisence поможет писать код, а перед перенесением кода заменить декларацию и инициализацию объектов на Createobject.

Автор: nil5 03.07.07, 12:36
MIF, спасибо, я уже сам додумался ;)

Добавлено
хм, ну вот что я попробовал

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     Dim myReg As New VBScript_RegExp_55.RegExp
            Dim oMatches As VBScript_RegExp_55.MatchCollection
            Dim oMatch As VBScript_RegExp_55.Match
            Dim val As Integer
     
            Dim str As String
            str = "BatteryVoltageLow = 0;"
     
            myReg.Pattern = ".*BatteryVoltageLow\s*=\s*(\d);.*"
     
            oMatches = myReg.Execute(str)
            oMatch = oMatches(0)
            val = oMatch.Value


в val мне возвращается вся строка, а мне надо только чтоб я получил 0, я ведь для этого и сгруппировал (\d), в перле я бы взял $1 и получил бы значение группы, а как здесь.

Автор: ANDLL 03.07.07, 12:49
submatches коллекция

Автор: nil5 03.07.07, 12:53
победил зверя! Всем спасибо.

Автор: nil5 03.07.07, 14:42
Написал я скрипт. Протестировал в студии. Потом перенес на другую машину где стоит МОМ и вот что он мне сказал

Description:
An error occurred on line 13 while executing script 'CreateController'
Source: Microsoft VBScript runtime error
Description: ActiveX component can't create object: 'VBScript_RegExp_55.RegExp' . Please refer to the events associated with this alert to view the computers on which this problem occurred.

Т.е. нет этой компанента на этой машине, как мне его найти и правильно зарегистрировать.

Добавлено
посмотрел на маштне с МОМ, есть длл vbscript, но она меньше по размеру чем на моей. Ее наверно надо разрегистрировать добавить новую и зарегистрировать. Так?

Добавлено
да собственно не в машине дело. Скрипт не запускается на любой машине, мне кажется я просто неправильно создаю объекты

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Set reg = CreateObject("VBScript_RegExp_55.RegExp")
    Set Matches = CreateObject("VBScript_RegExp_55.MatchCollection")
    Set Match = CreateObject("VBScript_RegExp_55.Match")
    Set SubMatch = CreateObject("VBScript_RegExp_55.SubMatches")


Вот так у меня. Что здесь может быть не так?

Автор: ANDLL 03.07.07, 16:32
Все нетак, кроме первой строчки

Автор: nil5 03.07.07, 19:16
ANDLL а можно пояснить, если не затруднит.

Автор: nash 03.07.07, 20:37
Цитата nil5 @
Set Matches = CreateObject("VBScript_RegExp_55.MatchCollection")
Set Match = CreateObject("VBScript_RegExp_55.Match")
Set SubMatch = CreateObject("VBScript_RegExp_55.SubMatches")


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

Автор: nil5 04.07.07, 09:31
упростил скрипт до предела, вот весь его код

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Option Explicit
     
    Set reg = CreateObject("VBScript_RegExp_55.RegExp")


но при запуске получаю следующие сообщение:
"Невозможно создание объекта контейнером ActiveX: 'VBScript_RegExp_55.RegExp'"

Автор: Dmitrii 04.07.07, 10:24
А если так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Set reg = CreateObject("VBScript.RegExp")

Автор: nil5 04.07.07, 10:54
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Dim reg
    Set reg = CreateObject("VBScript.RegExp")
     
    Dim Matches, Match, SubMatch, Inf
    Inf = "BatteryInfoAvaible =5;"
     
    reg.Pattern = ".*BatteryInfoAvaible\s*=\s*(\d);.*"
    Matches = reg.Execute(Inf)
    Match = Matches(0)
    SubMatch = Match.SubMatches
    Set BatteryInfoAvaible = SubMatch.Item(0)


Теперь выскакивает следующая ошибка
"Недопустимое число аргументов или присвоение значения свойства"

и ссылается на Matches = reg.Execute(Inf)

Как я понял метод ругается на возвращаемое значение. Как дальше то с ним работать?

Добавлено
а кто-нибудь сам уже пользовался в VBS этой библиотекой?

Автор: Dmitrii 04.07.07, 11:42
Цитата nil5 @
Теперь выскакивает следующая ошибка
"Недопустимое число аргументов или присвоение значения свойства"
и ссылается на Matches = reg.Execute(Inf)
Как я понял метод ругается на возвращаемое значение. Как дальше то с ним работать?
Попробуйте так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Dim reg
    Set reg = CreateObject("VBScript.RegExp")
    Dim objMatches, objMatch, objSubMatch, Inf
    Inf = "BatteryInfoAvaible =5;"
    reg.Pattern = ".*BatteryInfoAvaible\s*=\s*(\d);.*"
    Set objMatches = reg.Execute(Inf)
    Set objMatch = objMatches.Item(0)
    Set objSubMatch = objMatch.SubMatches
    BatteryInfoAvaible = objSubMatch.Item(0)

Автор: nil5 04.07.07, 12:52
Спасибо! Вроде заработало.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)