Всем привет!
Пишу сюда, так как здесь часто встречаются скриптописатели.
Вот, к примеру, задача: строку вида "Someone <someone@microsoft.com>" разделить на две строки — имя человека и мыло.
На Perl регулярное выражение выглядит так:
"([^<]*)<([^>]*)>" — то есть, "запомнить несколько символов до символа '<', затем проверить '<', затем запомнить несколько символов до символа '>', затем проверить '>'".
Если регексп совпадает, берем строки $1 и $2 — в них то, что надо.
По доке на RegExp (для JS и VBS), вроде, все также, однако в MatchCollection попадает фигня — либо все, либо ничего.
Я так и не понял, где у меня глюк
Здравствуйте Ort, Вы писали:
Ort>var str = "Someone <someone@microsoft.com>"; Ort>res = str.split(" "); Ort>alert(res[0]); Ort>alert(res[1]);
Мне и пришлось сделать с помощью split, правда в VBA.
Но вопрос остается — почему не работает регексп с группировкой '(', и как сделать, чтобы работал.
Здравствуйте Ort, Вы писали:
>>MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"
Ort>В Item(0), по видимому, пишется начальный. В JScript тоже самое, Ort>поэтому я и выводил 1 и 2.
Если просить (1), выводит ошибку "Недопустимый вызов или аргумент процедуры".
Да и в доке написано, что надо (0).
Как раз не пойму, почему расхождение с документацией?
Здравствуйте retalik, Вы писали:
R>Здравствуйте Ort, Вы писали:
>>>MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"
Ort>>В Item(0), по видимому, пишется начальный. В JScript тоже самое, Ort>>поэтому я и выводил 1 и 2. R>Если просить (1), выводит ошибку "Недопустимый вызов или аргумент процедуры".
Сдается мне, что там индекс какой-то болно хотрожопый у этой коллекции Matches. Скорее всего индексом является номер первого символа в совпадении. Соответственно, Item(0) и дает тебе всю строку.
В жабаскрипте тут возвращается не коллекция, а массив, с которым можно работать "в лоб".
R>Да и в доке написано, что надо (0).
В MSDN я такого не наблюдал. Там везде юзают конструкцию for element in collection ... next. Попробуй и у себя так все результаты отобразить.
R>Как раз не пойму, почему расхождение с документацией?
Вот я как раз никакого расхождения не вижу, поскольку не нашел ни одного места, где было бы сказано, как именно индексируется коллекция.
Здравствуйте Lexey, Вы писали:
R>>Да и в доке написано, что надо (0). L>В MSDN я такого не наблюдал. Там везде юзают конструкцию for element in collection ... next. Попробуй и у себя так все результаты отобразить.
Увы и ах (это полный .vbs, можешь сам запустить):
str = "Someone <someone@microsoft.com>"set re = new RegExp
re.Global=True
re.IgnoreCase=False
re.Pattern="([^<]*)<([^>]*)>"set myarray = re.Execute(str)
Dim m
For Each m In myarray
MsgBox m 'выводит 1 раз "Someone <someone@microsoft.com>"Next
R>>Как раз не пойму, почему расхождение с документацией? L>Вот я как раз никакого расхождения не вижу, поскольку не нашел ни одного места, где было бы сказано, как именно индексируется коллекция.
В описании Pattern проперти этого, не побоюсь этого слова, долбаного RegExp'а:
(pattern) Matches pattern and remembers the match. The matched substring can be retrieved from the resulting Matches collection, using Item [0]...[n]. To match parentheses characters ( ), use "\(" or "\)".
Здравствуйте retalik, Вы писали:
R>Здравствуйте Lexey, Вы писали:
R>>>Да и в доке написано, что надо (0). L>>В MSDN я такого не наблюдал. Там везде юзают конструкцию for element in collection ... next. Попробуй и у себя так все результаты отобразить. R>Увы и ах (это полный .vbs, можешь сам запустить):
Ага, так оно и есть.
R>
R>str = "Someone <someone@microsoft.com>"
R>set re = new RegExp
R>re.Global=True
R>re.IgnoreCase=False
R>re.Pattern="([^<]*)<([^>]*)>"
R>set myarray = re.Execute(str)
R>Dim m
R>For Each m In myarray
R> MsgBox m 'выводит 1 раз "Someone <someone@microsoft.com>"
R>Next
R>
R>>>Как раз не пойму, почему расхождение с документацией?
Увы, похоже нет никакого расхождения с документацией. Наблюдается расхождение в том, как работает васиковый регэксп и жабаскриптовый. См. хелп по SubMatches collection. В Matches возвращаются не отдельные совпадения, а совпадения со всем регэкспом, а подсовпадения попадают в SubMatches.
L>>Вот я как раз никакого расхождения не вижу, поскольку не нашел ни одного места, где было бы сказано, как именно индексируется коллекция.
R>В описании Pattern проперти этого, не побоюсь этого слова, долбаного RegExp'а: R>(pattern) Matches pattern and remembers the match. The matched substring can be retrieved from the resulting Matches collection, using Item [0]...[n]. To match parentheses characters ( ), use "\(" or "\)".
Здравствуйте Lexey, Вы писали:
L>Увы, похоже нет никакого расхождения с документацией. Наблюдается расхождение в том, как работает васиковый регэксп и жабаскриптовый. См. хелп по SubMatches collection. В Matches возвращаются не отдельные совпадения, а совпадения со всем регэкспом, а подсовпадения попадают в SubMatches.
Got it! Ответ оценён.
Вот если ты еще способ для VBA, но со Scripting Runtime младше 5.0 приведешь, я еще одну оценку поставлю
Правда похоже, его нет — разве только скриптлет на JS написать, где все работает
Здравствуйте retalik, Вы писали:
R>Здравствуйте Lexey, Вы писали:
L>>Увы, похоже нет никакого расхождения с документацией. Наблюдается расхождение в том, как работает васиковый регэксп и жабаскриптовый. См. хелп по SubMatches collection. В Matches возвращаются не отдельные совпадения, а совпадения со всем регэкспом, а подсовпадения попадают в SubMatches.
R>Got it! Ответ оценён. R>Вот если ты еще способ для VBA, но со Scripting Runtime младше 5.0 приведешь, я еще одну оценку поставлю
Здравствуйте Lexey, Вы писали:
L>Увы, тут я пас. А почему тебе именно 5.0 нужен?
Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф
Здравствуйте retalik, Вы писали:
R>Здравствуйте Lexey, Вы писали:
L>>Увы, тут я пас. А почему тебе именно 5.0 нужен?
R>Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф
Хм, а версию скриптового рантайма-то почему ограничиваешь?
Здравствуйте Lexey, Вы писали:
L>>>Увы, тут я пас. А почему тебе именно 5.0 нужен? R>>Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф L>Хм, а версию скриптового рантайма-то почему ограничиваешь?
Да нет, хотелось чтобы у всех работало, а не только у (счастливых?) обладателей .NET Server
5.0 идет, имхо, даже с Win98SE.
А вообще, уже сделал через скриптлет на JScript — вроде, нормально получилось.
Просто странно — в JScript можно sub matches получить (везде, где есть регексп), а в VBScript они до этого додумались только в версии 5.5
Здравствуйте retalik, Вы писали:
R>Здравствуйте Lexey, Вы писали:
L>>Хм, а версию скриптового рантайма-то почему ограничиваешь?
R>Да нет, хотелось чтобы у всех работало, а не только у (счастливых?) обладателей .NET Server
Зачем так пугать-то.
R>5.0 идет, имхо, даже с Win98SE.
Дык, а кто мешает владельцу того же Win95 скачать и установить себе Runtime V5.6? Он же маленький.
R>А вообще, уже сделал через скриптлет на JScript — вроде, нормально получилось. R>Просто странно — в JScript можно sub matches получить (везде, где есть регексп), а в VBScript они до этого додумались только в версии 5.5