2016-01-28 2 views
2

Я немного смущен относительно того, как работает RegExp. Я очень рад использовать его для поиска строк, используя что-то вроде блокнота ++, однако теперь я пытаюсь выполнить поиск по строке в VBScript, а RegExps, которые работают в блокноте ++, не совместимы с VBScript. Я неправильно предполагал, что регулярное выражение является стандартом. Так или иначе.VBScript RegEx не соответствует

Строка Я пытаюсь искать через это:
"kcabllaCsrevirD -) 0x0 = TLUSERH ('FNI.TRWTS\049BE47424A6-2898-65A4-3538-602212F0\#\$1#40C0010B$gkPrevirD_O_\10RPAFJUOS\\' egakcaP revirD 8202=DI

Я пытаюсь определить:
FNI.TRWTS\

Используя Notepad ++, и пытается следовать sytax, как описано в this MSDN article I «придумали»:
.*?fni\..*?\\

Может ли кто-нибудь указать мне правильное направление здесь? У меня есть другие регулярные выражения, работающие в VB, так что я счастлив, что мой VB в порядке.

Для фона на струне - я перевернул строку текста из журнала DISM и пытаюсь извлечь имя драйвера, поэтому, чтобы выбрать fni.*, а затем отмените его на *.inf. Причина, по которой я делаю это так, пока я могу получить регулярные выражения для поиска не жадных (.*?) Я не могу найти способ сопоставления последнего в первую очередь.

Set objFso = CreateObject("Scripting.FileSystemObject") 
Set TxtDismLog = objFSO.GetFile("C:\Windows\SysWow64\CCM\Logs\dism.log").OpenAsTextStream(1,-2) 
Set TxtDriverOutput = objFSO.CreateTextFile("C:\Program Files\Sam\drivers.log", 8, True) 
Set objRegEx = CreateObject("VBScript.RegExp") 
Set objRegEx2 = CreateObject("VBScript.RegExp") 

objRegEx.Global = True 
objRegEx.IgnoreCase = True 
objRegEx.Pattern = "Found \d driver package" 

objRegEx2.Global = True 
objRegEx2.IgnoreCase = True 
objRegEx2.Pattern = "\bfni\.[^\\]*\\" 

txtDriverOutput.WriteLine Now() & Chr(32) & "Begin DISM Driver Scan" 
Do While TxtDismLog.AtEndOfStream <> True 
txtline = txtDismLog.ReadLine 
If objRegEx.Test(txtline) Then 
h = InStr(txtline,"Found") 
i = Mid(txtline,h+6,1) 
Do While i <> 0 
i = i - 1 
txtline = txtDismLog.ReadLine 
txtlinebwd = StrReverse(txtline) 
regfindbwd = objRegEx2.Execute(txtlinebwd) 
regfind = StrReverse(regfindbwd) 
txtDriverOutput.WriteLine regfind 
Loop 
End If 
Loop 
+0

Что известно в строке? 'Fni.'? BTW, какой тег правильный: vb.net или vbscript? Пожалуйста, покажите свой код. –

+0

Просто используйте fni \ .. *? \\ с флагом игнорирования. – sln

+0

Я не думаю, что могу использовать fni \ .. *? \\, так как далее через строку значение может повториться. Я добавлю полный код сейчас –

ответ

2

Обратите внимание, что использует Notepad ++ увеличить регулярки библиотеки, которая является очень мощной, и VBScript использует очень старую библиотеку регулярных выражений подобно тому, что опоры JavaScript (он очень ограничен по сравнению с Boost). Однако очень простые шаблоны будут работать одинаково.

Чтобы соответствовать подстроку, начиная с fni. и заканчивая \, вы можете использовать

\bfni\.[^\\]*\\ 

См regex demo

The \b силы fni быть целым словом. [^\\] соответствует любому персонажу, но \, * соответствует ноль или больше вхождений, а \\ соответствует одному \.

В RegExp.Execute возвращает все матчи, если вы установите objRegEx2.Global = True, поэтому нет установки петли точки.

+0

Работает ли она сейчас? Без файла 'dism.log' я не знаю, как помочь больше. –

+1

Да, этот запрос теперь работает. Ontop проблемы с регулярным выражением, которую я имел, я также случайно использовал метод тестирования вместо выполнения - что, безусловно, не помогло. –

Смежные вопросы