Проблема с регулярным выражением VBScript

У меня были серьезные проблемы с попыткой заставить мое регулярное выражение работать должным образом, пытаясь извлечь путь UNC. Я прочитал бесчисленное количество учебников, руководств и даже протестировал свои регулярные выражения в онлайн-тестерах регулярных выражений (где они, кажется, работают), но я все еще не могу заставить его работать в моем коде. Однако я могу заставить его работать, например, на PHP.

Я использую PrimalScript, чтобы посмотреть, что пойдет не так, но об этом позже. Вот мой текущий код, который я использую:

Dim WSHShell, strString, nrMatches, myMatches

Set WSHShell = CreateObject("WScript.Shell")
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
' myRegExp.Pattern = "^\\\\(.*?)+\\(.*)*\s...\\(.*)*$"  <-- Returns 1 match, the whole String
' myRegExp.Pattern = "^\\\\(\w?)+\\(\w)*\s...\\(\w)*$"  <-- Returns 0 matches
' myRegExp.Pattern = "^\\\\(.*?)+\\\(.*)*\s...\\\(.*)*$"  <-- Gives Syntax Error
' myRegExp.Pattern = "^\\\\\\\\(.*?)+\\\(.*)*\s...\\\(.*)*$" <-- Gives Syntax Error
' myRegExp.Pattern = "^\\\\(.*)\\(.*)\s\.\.\.\\(.*)?$"  <-- Returns 1 match, the whole String
myRegExp.Pattern = "^(.*)+\\(.*)+(\s\.\.\.\\(.*))?$" ' <-- Returns 1 match, the whole String

strString = "\\domain.subnet.net\share1 ...\share2"

Set myMatches = myRegExp.Execute(strString)
nrMatches = myMatches.Count
MsgBox "Found " & nrMatches & " Matches!", vbOKOnly, "Number of Matches"
For Each myMatch In myMatches
    MsgBox "Value: " & myMatch.Value, vbOKOnly, "Found Match"
Next
WScript.Quit

Прокомментированные регулярные выражения - это лишь небольшая часть того, что я пробовал, это те, с которыми я добился "наибольшего" успеха.

Одна вещь, которая бросилась мне в глаза, заключалась в том, что во время отладки в PrimalScript он в основном сказал мне, что myMatches.Item = Invalid number of parameters Хотя поиск в Google ничего не дал мне, но, возможно, кто-то здесь знает, какие параметры нужны Execute? Я мог бы предоставить скриншот, если это необходимо, просто дайте мне знать.

Спасибо, я буду признателен за любые указатели или советы, которые помогут мне в этом. =]


person Exodus    schedule 05.05.2011    source источник


Ответы (2)


Я не уверен, чего вы ожидаете.

Вы хотите получить результат strString = "\\domain.subnet.net\share1 ...\share2" в 2 матчах? (Будет ли ...\share2 допустимым путем?)

Если в вашей строке есть только пути, разделенные пробелами, вы можете попробовать:

[^\s]+ см. rubular

or

[\\\w.]+ см. рубли

или если он должен начинаться с \\или .

(?<=\A|\s)(?:\\|\.)[^\s]+ см. Regexr (поскольку rubular не поддерживает поиск позади)

ОБНОВЛЕНИЕ:

Согласно вашим комментариям, я надеюсь, что это сделает то, что вы хотите:

^((?:\\|\.)[^\s]+)\\[^\\\s]+\s+\.{3}([^\s]*)

рубуляр

Вы найдете путь до последней \ в группе 1 и часть, следующую за ... в группе 2. Таким образом, чтобы получить замену, вам нужно просто объединить группу 1 и группу 2.

person stema    schedule 06.05.2011
comment
@Stema еще одно пояснение: общие ресурсы также могут быть множественными, что означает, что если строка i \\domain.subnet.net\share1\share2 ...\share3, я хочу извлечь общий ресурс 3 и заменить им общий ресурс 2. Другими словами, цель состоит в том, чтобы сопоставить (в данном случае) \\domain.subnet.net\share1*share2* и \\domain.subnet.net\share1*share3*< /я> - person Exodus; 06.05.2011
comment
Привет, @Stema, насколько я понял, VBScript не позволяет смотреть назад (см. regular -expressions.info/vbscript.html) либо - это может быть причиной этого? Кроме того, ваше второе предложение Regexr вызывает у меня синтаксическую ошибку в регулярном выражении. Чтобы прояснить свои намерения, мне нужно собрать две акции именно в это. Три параллельные точки (...) означают, что все до последней папки должно быть одинаковым. Я подумал, что будет намного проще попытаться использовать регулярное выражение для извлечения данных и манипулирования ими. Возможно, лучше всего делать это поэтапно? - person Exodus; 06.05.2011
comment
@ Даниэль, извини, я не проверил это, читая VB ... Я думал о .net, который поддерживал бы взгляд позади. Тогда попробуйте это здесь Rubular (?:^|\s)((?:\\|\.)[^\s]+). Взгляд назад был только для того, чтобы избежать того, что это будет в результате. С этим регулярным выражением также сопоставляется начальный пробел, но вместо этого я помещаю ваш путь в первую группу захвата. Я также заменил \A, который также не поддерживается VBScript. - person stema; 06.05.2011
comment
@Exodus, поэтому я добавил еще одно решение, надеюсь, я подойду ближе. - person stema; 06.05.2011
comment
@Stema К сожалению, ни одно из ваших предложений не сработало. Меньший выдал исключение (ожидаемое ')' в регулярном выражении). Первый дал только одну спичку; вся струна. Также в Rebular отсутствует Share2 во втором примере? Кстати, я очень ценю помощь! :) - person Exodus; 06.05.2011
comment
@Stema Думаю, теперь я сделал еще один шаг вперед. Я использую это: (?:‹(\[-\d\w\s\.]+?)›)|(\[-\d\w\.]+)|(\\\[-\d\ w\.]+) теперь, и он успешно соответствует \\domain.subnet.net, \share1, \share2, \shareX и т. д. С одной небольшой модификацией он будет работать так, как я хочу; он должен создать группу для всего до первой обратной косой черты, т. е. первая группа соответствия в только что упомянутом примере должна быть \\domain.subnet.net\share1, тогда две другие будут содержать \share2, \share3 и \shareX соответственно (где x — это x количество дополнительных акций, которые он может найти). - person Exodus; 06.05.2011
comment
@Stema Я укажу это как ответ, так как это приблизило меня к тому, что я искал. Спасибо :) - person Exodus; 08.05.2011

Что-то вроде этого помогает?

http://regexlib.com/REDetails.aspx?regexp_id=2396

Кажется, они предлагают

^[a-zA-Z]\:\.|^\\.

Я также видел (?:‹(\\[-\d\w\\s]+?)>)|(\\[-\d\w\]+) в поиске Google.

person mikeY    schedule 05.05.2011
comment
Привет @mikeY, это дало мне совпадения \domain, \share1 и \share2. Близко, но еще не там. Я попытаюсь изменить ваше предложение, чтобы увидеть, работает ли оно :) - person Exodus; 06.05.2011