2017-05-29 3 views
1

Ich muss Zahlen mit entweder 7 Ziffern oder 8 Ziffern genau aus einer Spalte in meiner Excel-Datei extrahieren und alle verwerfen Zahlen mit mehr Ziffern.Regulärer Ausdruck, um Zahlen entweder mit genau 8 Ziffern oder mit genau 7 Ziffern zu extrahieren und zu verwerfen, wenn Nummer mehr Ziffern hat

Zum Beispiel diese annehmen, sind einige der Werte

2569123659 | Extrahieren Sie nichts seit> 8 Ziffern

2456789 | 2456789 | Extract 7-stellig nein

15034891 | 15034891 | Extract 8-stellig nein

2569123659 45785612 | 45785612 | Extract nur 8 Ziffern keine

2456789 2569123659 | 2456789 | Nur 7 Ziffern extrahieren Nein

ABC# 2456789 | 2456789 | Nur Auszugsnummer

ABC15034891DSC | 15034891 | Nur Auszugsnummer

ABC15034891 ### | 15034891 | Extrahieren nur Zahl

Die folgenden sind einige der Ausdrücke ich versuchte

strPattern = „[0-9] {7} ([0-9] {1})?"

Ergebnisse: Falsches Ergebnis

2569123659 | 2456789

2456789 | 15034891

15034891 | 25691236

2569123659 45785612 | 2456789

2456789 2569123659 | 2.456.789

ABC# 2456789 | 2456789

ABC15034891DSC | 15034891

ABC15034891 ### | 15034891

strPattern = "(\ d {8} | \ d {7})"

Ergebnisse: Still Wrong Ergebnis

2569123659 | 25691236

2456789 | 2456789

15034891 | 15034891

2569123659 45785612 | 25691236

2456789 2569123659 | 2456789

ABC# 2456789 | 2456789

ABC15034891DSC | 15034891

ABC15034891 ### | 15034891

Hilf mir diesen reg Ausdruck zu korrigieren, um das Szenario zu behandeln. Ich muss nur die richtige Nummer extrahieren. Ich muss die Extraktion von einem anderen Nein mit mehr Ziffern vermeiden.

Jede Art von Hilfe wird sehr geschätzt.

Vielen Dank im Voraus


auf Antworten Basierend hier zur Verfügung gestellt Ich habe auch versucht

strPattern = "\ b (\ d {7,8}) \ b"

Ergebnisse: Immer noch falsch Ergebnis

25 69123659 |

2456789 | 2456789

15034891 | 15034891

2569123659 45785612 | 45785612

2456789 2569123659 | 2456789

ABC# 2456789 |

ABC15034891DSC |

ABC15034891 ### |

Immer noch nicht genau

Antwort

1

Verwenden Sie den folgenden regulären Ausdruck:

(?:^|\D)(\d{7,8})(?!\d) 

Ihre 7 oder 8-stellige Nummer wird in .Submatches(0) sein.

Die (?:^|\D) stimmt entweder mit dem Anfang der Zeichenfolge oder einer Nicht-Ziffer überein, und die negative Vorausschau (?!\d) schlägt die Übereinstimmung fehl, wenn eine Ziffer unmittelbar nach der sieben- oder achtstelligen Zahl rechts gefunden wird.

Siehe regex demo.

ein Beispiel Code Siehe:

Sub GetResults() 
Dim rExp As Object, allMatches As Object, match As Object 
Dim text As String 

text = "ABC15034891###" 

Set rExp = CreateObject("vbscript.regexp") 
With rExp 
    .Global = True 
    .MultiLine = False 
    .pattern = "(?:^|\D)(\d{7,8})(?!\d)" 
End With 


Set allMatches = rExp.Execute(text) 
For Each match In allMatches 
    Debug.Print(match.SubMatches.Item(0)) 
Next 

End Sub 
+0

Stribizew Danke aber das funktioniert nicht in den folgenden Fällen ABC# 2456789 ABC15034891DSC ABC15034891 ### – eccentricCoder

+1

@eccentricCoder [ Es funktioniert gut für diese Fälle] (https://regex101.com/r/AuH2zo/1/). –

+0

Für die oben genannten Fälle, gibt es die Zahl zusammen mit dem # oder Alphabet an es für zB ABC# 2456789 zurückgibt es ABC# 2456789 zurück, für ABC15034891DSC gibt C15034891 zurück und für ABC15034891 ### gibt C15034891 – eccentricCoder

1

Versuchen \D(\d{7,8})\D:

\b -> word boundary 
\d -> digit [0-9] 
\D -> non digit 

Demo: https://regex101.com/r/2R5HRN/2

+1

ich, wenn die OP fragen, will von der siebenstelligen Zahl extrahieren 'abc1234567def'? –

+2

@Ashraful Islam Vielen Dank, das löst mein Problem. – eccentricCoder

+1

@eccentricCoder Nun habe ich die Nummer gruppiert, so dass Sie mit '$ 1' darauf zugreifen können. –

Verwandte Themen