2016-06-29 4 views
1

Ich habe eine Tabelle table1 mit einem Feld Telefon. Dies ist ein Zeichenfolgenfeld, das neben der Zahl noch weitere Zeichen enthält. Ich möchte alle Zahlen aus der Zeichenfolge extrahieren.Wie extrahiert man alle Zahlen aus einem String mit Regex?

enter image description here

Ich habe versucht, "[0-9] +" aber ich bekomme nur die erste Gruppe von Zahlen in jeder Zeile. Ich habe versucht, online zu suchen, aber die Regexe, die ich versuchte, waren mit dem Zugriff nicht kompatibel. Bitte erklären Sie auch die Regex. Vielen Dank.

Dies ist die VBA regex Funktion Ich verwende:

Function myRegex(ByRef myString As String, ByVal pattern As String) As String 
    Dim rgx As New RegExp 
    Dim colMatches As MatchCollection 
    With rgx 
     .pattern = pattern 
     .ignoreCase = True 
     .Global = False 
     .Multiline = False 
     Set colMatches = .Execute(myString) 
    End With 
    If colMatches.Count > 0 Then 
     myRegex = colMatches(0).Value 
    Else 
     myRegex = "" 
    End If 
End Function 
+1

[Öffentliche Funktion OnlyDigits (ByVal pInput als String) als String] (http://Stackoverflow.com/a/12570564/77335) – HansUp

+0

Können Sie [bearbeiten], um das Code-Snippet einzufügen, das Sie ausführen, um die Regex auszuführen. Möglicherweise müssen Sie die Regex-Datei mehrmals ausführen, anstatt nur das Muster – Rhumborl

+0

@HansUp zu ändern, "^ \ d" entspricht nur dem Anfang der Zeichenfolge. – MJH

Antwort

1

... aber ich bekomme nur die erste Gruppe von Zahlen in jeder Zeile.

Erste Ausgabe ist, dass .Global = False bedeutet nur die erste Übereinstimmung zu finden. Wenn Sie alle Übereinstimmungen finden möchten, müssen Sie .Global = True

zweite Problem ist, dass Ihre Funktion aus dem MatchCollection nur das erste Spiel (colMatches(0)) zurückgibt. Auch nachdem Sie .Global zu True ändern, wird die Funktion nur die erste Übereinstimmung zurückgeben. Wenn Sie eine Zeichenfolge zurückgeben möchten, die alle Übereinstimmungen enthält, können Sie die Werte aller Übereinstimmungen in colMatches verketten.

Die folgende Version der Funktion macht, was ich denke, Sie wollen.

Function myRegex(ByRef myString As String, ByVal Pattern As String) As String 
    Dim rgx As New RegExp 
    Dim colMatches As MatchCollection 
    Dim i As Long 
    Dim strOutput As String 
    With rgx 
     .Pattern = Pattern 
     .IgnoreCase = True 
     '.Global = False 
     .Global = True 
     .Multiline = False 
     Set colMatches = .Execute(myString) 
    End With 
    If colMatches.Count > 0 Then 
     'myRegex = colMatches(0).Value 
     For i = 0 To (colMatches.Count - 1) 
      strOutput = strOutput & colMatches(i).Value 
     Next 
    'Else 
     'myRegex = "" 
    End If 
    myRegex = strOutput 
End Function 

Aber ich denke, OnlyDigits() ein einfacherer Ansatz ist. Die Strategie besteht darin, jedes Zeichen zu verwerfen, das keine Ziffer ist. Vergleichen Sie diese Funktion mit Ihrer.