VBS: RegEx-Teil auslagern

amn.ssy

Erfahrenes Mitglied
Hallo,

ich habe hier unterschiedliche VB-Scripte am Start, die vom Aufbau grundsätzlich gleich sind, sich aber im RegEx-Teil je nach Fall unterscheiden. Um nicht den gesamten Code (ok - ist überschaubar) anpacken zu müssen stelle ich mir vor den RegEx-Teil auszulagern und mit einer ID o.ä. zu verheiraten.
Exemplarisch sieht ein VBS-Code aktuell so aus:

Visual Basic:
InFile = WScript.Arguments(0)
OutFile = WScript.Arguments(1)

Set fso = CreateObject("Scripting.FileSystemObject")
If fso.GetFile(InFile).Size = 0 Then
    fso.CreateTextFile(OutFile)
    WScript.Quit
End If
T = fso.OpenTextFile(WScript.Arguments(0)).ReadAll

With New RegExp

	.Global = True
	.IgnoreCase = True
	.Multiline = True
    	
	
    '*** ersetze alle Leerzeichen >= 2 mit ";"
    .Pattern = "[ ]{2,}"
    T = .Replace(T, ";")

    '*** lösche alle ";" am Beginn jeder Zeile
    .Pattern = "^(;| )(.*)"
    T = .Replace(T, "$2")

    '*** ersetze alle "." und " " >=2 mit " " 
    .Pattern = "[. ]{2,}"
    T = .Replace(T, " ")

    '*** ersetze ":" mit ""
    .Pattern = "(:)"
    T = .Replace(T, "")

    '*** ersetze alles zw. erstem und letztem ";" durch ein ";"
    .Pattern = "(;.*;)"
    T = .Replace(T, ";")

    '*** setze "." zwischen Datum
    .Pattern = "([\d]{2})(.*)([\d]{2})(.*)(20[\d]{2})"
    T = .Replace(T, "$1.$3.$5")

    '*** setze ";*" wenn kein Werte nach Suchbegriff
    .Pattern = ""
    T = .Replace(T, "")


End With

fso.CreateTextFile(WScript.Arguments(1), True).Write(T)

Von der Sorte habe ich eine Ganze Menge die sich nur im Bereich zw. With ... und End With unterscheiden.

Zum Teil unterscheiden sich die VB-Scrpte aber auch nur vom Namen und sind intern gleich.
Das liegt daran, das ich in die zuverarbeitenden Dateien (PDF) zunächst reinschaue nach einer Prod-ID bzw. diese dann zusammenbaue.
Über diese Prod-ID wird dann das VB-Script angesprochen, das als Namen die Prod-ID trägt.
Das ganze würde ich gerne etwas vereinfachen bzw. leichter handhabbar machen.

Gruß
_opiWahn_
 

Yaslaw

n/a
Moderator
Mach doch einfach eine Funktion wo du die Patterns und Replaces als Array übergeben kannst

Visual Basic:
Function regexpA(ByVal iText As String, ByRef iPatterns() As String, ByRef iReplace() As String) As String
    Dim i
    
    regexpA = iText
    With New regexp
     
        .Global = True
        .IgnoreCase = True
        .Multiline = True
        For i = 0 To UBound(iPatterns)
            .pattern = iPatterns(i)
            regexpA = .replace(regexpA, iReplace(i))
        Next i
    End With

End Function

'Und ein Aufrufbeispiel
Public Sub testRegexpA()
    Dim p(1) As String
    Dim r(1) As String
    
    p(0) = "[ ]{2,}"
    r(0) = ";"

    p(1) = "^(;| )(.*)"
    r(1) = "$2"
    Debug.Print regexpA(";a,    b,c", p, r)
    
End Sub

Aber schöner ist es natürlich wenn du ein Typ definierst
Visual Basic:
Type regexpAType
    pattern As String
    replace As String
End Type

Function regexpA(ByVal iText As String, ByRef iPatterns() As regexpAType) As String
    Dim i
    
    regexpA = iText
    With New regexp
     
        .Global = True
        .IgnoreCase = True
        .Multiline = True
        For i = 0 To UBound(iPatterns)
            .pattern = iPatterns(i).pattern
            regexpA = .replace(regexpA, iPatterns(i).replace)
        Next i
    End With

End Function

Type regexpAType
    pattern As String
    replace As String
End Type
Public Sub testRegexpA()
    Dim p(1) As regexpAType
    Dim r(1) As String
    
    p(0).pattern = "[ ]{2,}"
    p(0).replace = ";"
    
    p(1).pattern = "^(;| )(.*)"
    p(1).replace = "$2"
    Debug.Print regexpA(";a,    b,c", p)
    
End Sub


Oder wnn du das auslagern willst in ein ini-File bietet sich die JSON-Schreibweise des Arrays an
Visual Basic:
'http://www.ediy.co.nz/vbjson-json-parser-library-in-vb6-xidc55680.html
Public Sub testRegexpA()
    Dim p As Dictionary
    
    Set p = JSON.parse("{0:{""pattern"":""[ ]{2,}"",""replace"":"";""},1:{""pattern"":""^(;| )(.*)"",""replace"":""$2""}")
    Debug.Print regexpA(";a,    b,c", p)
    
End Sub

Function regexpA(ByVal iText As String, ByRef iPatterns As Dictionary) As String
    Dim i
    Dim p As Dictionary
    
    regexpA = iText
    With New regexp
     
        .Global = True
        .IgnoreCase = True
        .Multiline = True
        For i = 0 To iPatterns.count - 1
            Set p = iPatterns.items(i)
            .pattern = p.item("pattern")
            regexpA = .replace(regexpA, p.item("replace"))
        Next i
    End With

End Function