Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1560to1564
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

RegEx Duplikate

RegEx Duplikate
02.06.2017 09:27:16
Stephan
Hallo Forum! Die nachfolgende RegEx-Syntax sorgt in meinem VBA-Skript (mit eingebauter Schleife) dafür, dass die bereits aufgefundenen Matches für VB-\d{2} (z.B. VB-80) kein weiteres mal gematcht werden. Der Effekt ist gewünscht, allerdings verstehe ich die Syntax nicht. Ich kann mir zwar die einzelnen Elemente von diversen Regex Cookbooks erklären lsasen, doch ergibt sie für mich in Summe keinen Sinn. Könnte jemand freundlicherweise die Syntax mit mir Schritt für Schritt durchgehen? :) Danke!
.Pattern = "(VB-\d{2})(?!.*?\1.*$)"

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: RegEx Duplikate
02.06.2017 10:22:45
Stephan
Es handelt sich bei (?!...) als scheinbar um eine sog. "zero-width negative look-ahead" assertion, die in Leserichtung (rechts) dafür sorgt, dass das bereits aufgefundene Match nicht noch einmal gematcht wird. Der Bezug zum zuvor aufgefundenen Match wird mWn über \1 hergestellt.
AW: RegEx Duplikate
02.06.2017 10:24:18
Stephan
*Kontrollkästchen aktivieren*
AW: RegEx Duplikate
02.06.2017 10:27:19
JoWE
AW: Sorry, kannst Du dein Script posten ?
02.06.2017 10:35:24
JoWE
AW: Sorry, kannst Du dein Script posten ?
02.06.2017 10:44:59
Stephan

Public Sub Main()
Dim varOut() As Variant
Dim objRegEx As Object
Dim lngSpalte As Long
Dim objRegA As Object
Dim varArr As Variant
Dim lngUArr As Long
Dim lngTMP As Long
On Error GoTo Fin
With Tabelle1
varArr = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
Set objRegEx = CreateObject("VBScript.Regexp")
With objRegEx
.Pattern = "(VB-\d{2})(?!.*?\1.*$)"
.Global = True
For lngUArr = 1 To UBound(varArr)
Set objRegA = .Execute(varArr(lngUArr, 1))
If objRegA.Count >= lngSpalte Then
lngSpalte = objRegA.Count
End If
Set objRegA = Nothing
Next lngUArr
If lngSpalte = 0 Then Exit Sub
ReDim varOut(1 To UBound(varArr), 1 To lngSpalte)
For lngUArr = 1 To UBound(varArr)
Set objRegA = .Execute(varArr(lngUArr, 1))
For lngTMP = 1 To objRegA.Count
varOut(lngUArr, lngTMP) = objRegA(lngTMP - 1)
Next lngTMP
Set objRegA = Nothing
Next lngUArr
End With
.Cells(2, 2).Resize(UBound(varOut), UBound(varOut, 2)) = varOut
End With
Fin:
Set objRegA = Nothing
Set objRegEx = Nothing
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub

Anzeige
AW: Sorry, kannst Du dein Script posten ?
02.06.2017 11:32:44
JoWE
Hallo Stephan,
Du hast doch schon fast alles korrekt erläutert.
Das kannte ich so im Detail auch nicht.
Wofür aber steht dazu noch das "*?"
Lass ich es im Script weg ist das Ergebnis unverändert.
Trotzdem wieder was gelernt, danke
Und dazu fand ich dies: http://www.regular-expressions.info/backref.html
Gruß
Jochen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige