2016-10-13 5 views
0

Можно ли сделать что-то вроде следующего:Замена захваченных групп в регулярных выражениях

Sub GetANewDirectory() 
    Dim MyString As String 
    MyString = "C:\File1\File2\File3\AnImportantFile.txt" 

    Dim MyRegEx As New VBScript_RegExp_55.RegExp 
    With MyRegEx 
     .Global = True 
     .IgnoreCase = True 
     .MultiLine = False 
     .Pattern = ".*(File1)\\(File2)\\(File3).*" 
    End With 

    Dim MyMatch As Variant   
    Set MyMatch = MyRegEx.Execute(MyString) 

    ' The following syntax doesn't work 
    MyMatch(0).SubMatches(0) = Func1(MyMatch(0).SubMatches(0)) 
    MyMatch(0).SubMatches(1) = Func2(MyMatch(0).SubMatches(1)) 
    MyMatch(0).SubMatches(2) = Func3(MyMatch(0).SubMatches(2)) 

    Debug.Print MyMatch(0) 
    ' My desired result is: 
    ' C:\File1Apple\File2Banna\File3Mango\AnImportantFile.txt 
End Sub 

Function Func1(Arg1 As String) As String 
    Func1 = Arg1 & "Apple" 
End Function 

Function Func2(Arg1 As String) As String 
    Func2 = Arg1 & "Banna" 
End Function 

Function Func3(Arg1 As String) As String 
    Func3 = Arg1 & "Mango" 
End Function 

Мои извинения, если это кажется немного абстрактным, но у меня есть реальная потребность в чем-то вроде этого. Я уверен, что я могу выполнить задачу без регулярных выражений, но я вижу, где эта функция может быть полезна.

+0

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

ответ

0

Если вам действительно нужно использовать внешние функции для обработки операции, то лучшим вариантом (с регулярным выражением) является передача указателя функции в метод .Replace объекта RegExp. Эта функция получит в качестве аргумента:

  1. Часть строки, которая соответствовала шаблону в RegExp
  2. один аргумент для каждой из групп захвата в структуре
  3. Смещение в исходной строке, где рисунок соответствует
  4. Исходная строка

функция должна возвращать строку, которая заменит часть исходной строки, которая соответствовала шаблону.

Option Explicit 

Dim MyString 
    MyString = "C:\File1\File2\File3\AnImportantFile.txt" 

    With New RegExp 
     .Global = True 
     .IgnoreCase = True 
     .MultiLine = False 
     ' groups:  (1 ) (2 ) (3 ) 
     .Pattern = "\\([^\\]+)\\([^\\]+)\\([^\\]+)\\" 
     MyString = .Replace(MyString, GetRef("ReplaceHandler")) 
    End With 

    WScript.Echo MyString 


Function ReplaceHandler(matchedString, group1, group2, group3, offset, originalString) 
    ReplaceHandler = Join(Array("", Func1(group1), Func2(group2), Func3(group3), ""), "\") 
End Function  

Function Func1(Arg1) 
    Func1 = Arg1 & "Apple" 
End Function 
Function Func2(Arg1) 
    Func2 = Arg1 & "Banna" 
End Function 
Function Func3(Arg1) 
    Func3 = Arg1 & "Mango" 
End Function