Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 10.01.02 05:40
Оценка:
Всем привет!
Пишу сюда, так как здесь часто встречаются скриптописатели.

Вот, к примеру, задача: строку вида "Someone <someone@microsoft.com>" разделить на две строки — имя человека и мыло.
На Perl регулярное выражение выглядит так:
"([^<]*)<([^>]*)>" — то есть, "запомнить несколько символов до символа '<', затем проверить '<', затем запомнить несколько символов до символа '>', затем проверить '>'".
Если регексп совпадает, берем строки $1 и $2 — в них то, что надо.

По доке на RegExp (для JS и VBS), вроде, все также, однако в MatchCollection попадает фигня — либо все, либо ничего.
Я так и не понял, где у меня глюк
Успехов,
Виталий.
Re: Странный этот RegExp...
От: Ort США  
Дата: 10.01.02 08:10
Оценка:
var str = "Someone <someone@microsoft.com>";
res = str.split(" ");
alert(res[0]);
alert(res[1]);
"По мне, уж лучше пей, да дело разумей"
Re[2]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 10.01.02 08:24
Оценка:
Здравствуйте Ort, Вы писали:

Ort>var str = "Someone <someone@microsoft.com>";

Ort>res = str.split(" ");
Ort>alert(res[0]);
Ort>alert(res[1]);
Мне и пришлось сделать с помощью split, правда в VBA.
Но вопрос остается — почему не работает регексп с группировкой '(', и как сделать, чтобы работал.
Успехов,
Виталий.
Re[3]: Странный этот RegExp...
От: Ort США  
Дата: 10.01.02 08:44
Оценка:
У меня работает.

var str = "Someone <someone@microsoft.com>";
re = /([^<]*)<([^>]*)>/g;
myarray = re.exec(str);
alert(myarray[1]);
alert(myarray[2]);

Подробности здесь:
http://developer.netscape.com/docs/manuals/js/client/jsguide/regexp.htm
"По мне, уж лучше пей, да дело разумей"
Re[4]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 10.01.02 10:59
Оценка:
Здравствуйте Ort, Вы писали:
Ort>У меня работает.
Вот-вот! И должно работать! А что не так в таком VBScript-коде:
str = "Someone <someone@microsoft.com>"
set re = new RegExp
re.Global=True
re.IgnoreCase=False
re.Pattern="([^<]*)<([^>]*)>" 
set myarray = re.Execute(str)
MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"



Ort>Подробности здесь:

Ort>http://developer.netscape.com/docs/manuals/js/client/jsguide/regexp.htm
Спасибо за ссылку, но там классические регекспы описаны, которые я (слава богу) знаю.
Успехов,
Виталий.
Re[5]: Странный этот RegExp...
От: Ort США  
Дата: 10.01.02 11:13
Оценка:
>MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"

А ты загляни в
myarray.Item(1)
и
myarray.Item(2)
В Item(0), по видимому, пишется начальный. В JScript тоже самое,
поэтому я и выводил 1 и 2.
"По мне, уж лучше пей, да дело разумей"
Re[6]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 10.01.02 11:27
Оценка:
Здравствуйте Ort, Вы писали:

>>MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"


Ort>В Item(0), по видимому, пишется начальный. В JScript тоже самое,

Ort>поэтому я и выводил 1 и 2.
Если просить (1), выводит ошибку "Недопустимый вызов или аргумент процедуры".
Да и в доке написано, что надо (0).
Как раз не пойму, почему расхождение с документацией?
Успехов,
Виталий.
Re[5]: Странный этот RegExp...
От: IT Россия linq2db.com
Дата: 10.01.02 15:05
Оценка:
Здравствуйте retalik, Вы писали:

R>MsgBox myarray.Item(0) 'выводит "Someone <someone@microsoft.com>"

R>

Попробуй Item(1) и Item(2).
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Странный этот RegExp...
От: Ort США  
Дата: 10.01.02 15:18
Оценка:
Я уже пробовал, ошибка возникает.
И вообще, что ты тут делаешь?
Марш в COM!!! Там я тебе вопросики подкинул.
"По мне, уж лучше пей, да дело разумей"
Re[7]: Странный этот RegExp...
От: IT Россия linq2db.com
Дата: 10.01.02 15:24
Оценка:
Здравствуйте Ort, Вы писали:

Ort>Я уже пробовал, ошибка возникает.


А на JScript такое работает на ура.

str = "Someone <someone@microsoft.com>";
arr = /([^<]*?)<([^>]*?)>/g.exec(str);
str1 = arr[1]; //RegExp.$1
str2 = arr[2]; //RegExp.$2


Ort>И вообще, что ты тут делаешь?

Ort>Марш в COM!!! Там я тебе вопросики подкинул.

Ухожу, ухожу...
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Странный этот RegExp...
От: Ort США  
Дата: 10.01.02 15:29
Оценка:
Ты это у кого так код научился писать ?
(Смотри мое сообщение под номером 3).
Даже одну переменную также назвал.

Ведь раньше сидел аж за 3 стола от меня.
"По мне, уж лучше пей, да дело разумей"
Re[7]: Странный этот RegExp...
От: Lexey Россия  
Дата: 10.01.02 19:06
Оценка:
Здравствуйте 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>Как раз не пойму, почему расхождение с документацией?


Вот я как раз никакого расхождения не вижу, поскольку не нашел ни одного места, где было бы сказано, как именно индексируется коллекция.
Re[8]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 11.01.02 04:11
Оценка:
Здравствуйте 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 "\)".
Успехов,
Виталий.
Re[9]: Странный этот RegExp...
От: Lexey Россия  
Дата: 11.01.02 09:11
Оценка: 9 (1)
Здравствуйте 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 "\)".

Да, действительно, есть такая буква.
Re[10]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 11.01.02 10:13
Оценка:
Здравствуйте Lexey, Вы писали:

L>Увы, похоже нет никакого расхождения с документацией. Наблюдается расхождение в том, как работает васиковый регэксп и жабаскриптовый. См. хелп по SubMatches collection. В Matches возвращаются не отдельные совпадения, а совпадения со всем регэкспом, а подсовпадения попадают в SubMatches.


Got it! Ответ оценён.
Вот если ты еще способ для VBA, но со Scripting Runtime младше 5.0 приведешь, я еще одну оценку поставлю
Правда похоже, его нет — разве только скриптлет на JS написать, где все работает
Успехов,
Виталий.
Re[11]: Странный этот RegExp...
От: Lexey Россия  
Дата: 11.01.02 10:29
Оценка:
Здравствуйте retalik, Вы писали:

R>Здравствуйте Lexey, Вы писали:


L>>Увы, похоже нет никакого расхождения с документацией. Наблюдается расхождение в том, как работает васиковый регэксп и жабаскриптовый. См. хелп по SubMatches collection. В Matches возвращаются не отдельные совпадения, а совпадения со всем регэкспом, а подсовпадения попадают в SubMatches.


R>Got it! Ответ оценён.

R>Вот если ты еще способ для VBA, но со Scripting Runtime младше 5.0 приведешь, я еще одну оценку поставлю

Увы, тут я пас. А почему тебе именно 5.0 нужен?
Re[12]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 11.01.02 12:39
Оценка:
Здравствуйте Lexey, Вы писали:

L>Увы, тут я пас. А почему тебе именно 5.0 нужен?


Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф
Успехов,
Виталий.
Re[13]: Странный этот RegExp...
От: Lexey Россия  
Дата: 11.01.02 13:24
Оценка:
Здравствуйте retalik, Вы писали:

R>Здравствуйте Lexey, Вы писали:


L>>Увы, тут я пас. А почему тебе именно 5.0 нужен?


R>Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф


Хм, а версию скриптового рантайма-то почему ограничиваешь?
Re[14]: Странный этот RegExp...
От: retalik www.airbandits.com/
Дата: 14.01.02 07:58
Оценка:
Здравствуйте Lexey, Вы писали:

L>>>Увы, тут я пас. А почему тебе именно 5.0 нужен?

R>>Для вас же стараюсь . Хочу в конвертор RSDN Article.dot сделать раскраску кода на регекспах, как у IT в форумах. А работать в ворде на JS — не думаю, что будет в кайф
L>Хм, а версию скриптового рантайма-то почему ограничиваешь?

Да нет, хотелось чтобы у всех работало, а не только у (счастливых?) обладателей .NET Server
5.0 идет, имхо, даже с Win98SE.
А вообще, уже сделал через скриптлет на JScript — вроде, нормально получилось.
Просто странно — в JScript можно sub matches получить (везде, где есть регексп), а в VBScript они до этого додумались только в версии 5.5
Успехов,
Виталий.
Re[15]: Странный этот RegExp...
От: Lexey Россия  
Дата: 14.01.02 12:06
Оценка:
Здравствуйте retalik, Вы писали:

R>Здравствуйте Lexey, Вы писали:


L>>Хм, а версию скриптового рантайма-то почему ограничиваешь?


R>Да нет, хотелось чтобы у всех работало, а не только у (счастливых?) обладателей .NET Server


Зачем так пугать-то.

R>5.0 идет, имхо, даже с Win98SE.


Дык, а кто мешает владельцу того же Win95 скачать и установить себе Runtime V5.6? Он же маленький.

R>А вообще, уже сделал через скриптлет на JScript — вроде, нормально получилось.

R>Просто странно — в JScript можно sub matches получить (везде, где есть регексп), а в VBScript они до этого додумались только в версии 5.5

Козлы, одно слово.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.