1

Тема: VBS: Помогите построить регулярное выражение.

Добрый день.
Уже почти сутки бьюсь и никак не могу понять как сделать следующее:
Есть файл с кучей записей вида:
{fsdgfdfg-sdgsdfsdf-sdfsdf}\SomeText1
{pfpgpfgf-sdgsdfsdf-sdfsdf}\SomeText2
{zzzzzzzz-sdgsdfsdf-sdfsdf}\SomeText3
{xxxxxx{x-sdgsdfsdf-sdfsdf}\SomeText4
{fsdgfdfg-sdgsdfsdf-sdfsdf}\abracadabra
Нужно менять то что указано в скобках на свое значение, НО только в случае, если после слеша идет abracadabra

Я делаю такой регэксп: "\{[^\{]*?\}" - он прекрасно ищет {любая_строка}.
Но мне нужно с abracadabra на конце.
Пробую так: "\{[^\{]*?\}\\abracadabra" или так: "\{[^\{]*?\\abracadabra" - не находит ни в какую! Ошибок не дает, просто не делает замены.

P.S> RegEx нужен для использования в VBScript.

2

Re: VBS: Помогите построить регулярное выражение.

У меня тут у самого теория появилась - может проблема в кодировке? Там юникод, а VBScript в ANSI идет или еще как то так?

3

Re: VBS: Помогите построить регулярное выражение.

Тут фигурная скобка не лишняя?

{xxxxxx{x-sdgsdfsdf-sdfsdf}\SomeText4

У меня тут у самого теория появилась - может проблема в кодировке? Там юникод, а VBScript в ANSI идет или еще как то так?

Внутри себя VBScript сугубо «юникоден». Читать файл Вы как читаете — указываете, что внутри юникод?

4

Re: VBS: Помогите построить регулярное выражение.

alexii пишет:

Тут фигурная скобка не лишняя?

{xxxxxx{x-sdgsdfsdf-sdfsdf}\SomeText4

Нет, не лишняя. Должно взяться {x-sdgsdfsdf-sdfsdf}, а xxxxxx отброситься, поэтому в шаблоне есть [^{]

Внутри себя VBScript сугубо «юникоден». Читать файл Вы как читаете — указываете, что внутри юникод?

Спасибо за толчек
Сам допетрил - читаю из реестра REGBINARY - там каждая буква отделена от соседней бинарным нулем. Этот момент я упустил из виду. Т.е. RegExp мне нужно было делать таким: "\{[^\{]*?\}\\\x00a\x00b\x00r\x00a\x00c\x00a\x00d\x00a\x00b\x00r\x00a\x00"

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

5

Re: VBS: Помогите построить регулярное выражение.

+ открыть спойлер
alexii пишет:

Читать файл Вы как читаете…

Посмотрел и ужаснулся, что именно написал .

6

Re: VBS: Помогите построить регулярное выражение.

+ открыть спойлер
alexii пишет:
alexii пишет:

Читать файл Вы как читаете…

Посмотрел и ужаснулся, что именно написал .

Минус на минус дает плюс. Может быть по-другому бы и не понял бы

7

Re: VBS: Помогите построить регулярное выражение.

Товарищи, есть ли некий символ отрицания в regEx?
Мне вот что нужно:
Есть готовый регэксп: ^[A-Za-z0-9]*_[A-Za-z0-9]*\.[^inf]
Он находит строки в которых любойнабор_любойнабор.любойнабор(но не inf).
Так вот мне нужно сделать так чтобы искались все строки не удовлетворающие критерию. Т.е. грубо говоря инвертировать действие данного регэкспа.
Можно ли как-нибудь это сделать?

8

Re: VBS: Помогите построить регулярное выражение.

Он находит строки в которых любойнабор_любойнабор.любойнабор(но не inf).

Не совсем так.
В начале строки возможно произвольное число символов алфавита и цифр, затем подчёркивание, затем возможно произвольное число символов алфавита и цифр, точка, за которой не может следовать ни один из символов «i», «n», «f» (а вовсе не сочетание «inf»:

With WScript.CreateObject("VBScript.RegExp")
    .Pattern = "^[A-Za-z0-9]*_[A-Za-z0-9]*\.[^inf]"
    
    WScript.Echo .Test("A_A.a")
    WScript.Echo .Test("A_A.in")
    WScript.Echo .Test("A_A.inf")
    WScript.Echo .Test("A_A.fni")
    WScript.Echo .Test("A_A.nfi")
End With

, используйте negative lookahead pattern — наподобие «^[A-Za-z0-9]+_[A-Za-z0-9]+\.(?!inf)»). Ну, и ищет он не строки, а последовательность в строке.

Что мешает использовать банальное:

If Not objRegExp.Test("строка") Then
    …
End If

?

9 (изменено: Rumata, 2013-06-14 09:34:39)

Re: VBS: Помогите построить регулярное выражение.

Real Root

находит строки в которых любойнабор_любойнабор.любойнабор(но не inf)


' в начале строки
' хотя бы один символ - большая или маленькая латинская буква или цифра
' символ "подчеркивание"
' хотя бы один символ - большая или маленькая латинская буква или цифра
' символ "точка"
' что-то, но не "inf" (возможны "Inf", "INF" и т.д., также возможно совпадение с пустой подстрокой)
Set re = new RegExp()
re.Pattern = "^[a-zA-Z0-9]+_[a-zA-Z0-9]+\.(?!inf)"

If Not re.Test(string) Then
    ...
End If
( 2 * b ) || ! ( 2 * b )