it-swarm.com.de

gibt nur die Ziffern 0-9 aus einem String zurück

Ich brauche einen regulären Ausdruck, den ich in VBScript und .NET verwenden kann, der nur die Zahlen zurückgibt, die in einer Zeichenfolge gefunden werden. 

Für ein Beispiel sollte eine der folgenden "Zeichenfolgen" nur 1231231234 zurückgeben.

  • 123 123 1234
  • (123) 123-1234
  • 123-123-1234
  • (123)123-1234
  • 123.123.1234
  • 123 123 1234
  • 1 2 3 1 2 3 1 2 3 4

Dies wird in einem E-Mail-Parser verwendet, um Telefonnummern zu finden, die Kunden in der E-Mail angeben, und eine Datenbanksuche durchzuführen.

Ich habe vielleicht einen ähnlichen Regex verpasst, aber ich habe auf regexlib.com gesucht.

[BEARBEITEN] - Von RegexBuddy erzeugter Code wurde hinzugefügt, nachdem die Antwort von musicfreak eingerichtet wurde

VBScript-Code

Dim myRegExp, ResultString
Set myRegExp = New RegExp
myRegExp.Global = True
myRegExp.Pattern = "[^\d]"
ResultString = myRegExp.Replace(SubjectString, "")

VB.NET

Dim ResultString As String
Try
      Dim RegexObj As New Regex("[^\d]")
      ResultString = RegexObj.Replace(SubjectString, "")
Catch ex As ArgumentException
      'Syntax error in the regular expression
End Try

C #

string resultString = null;
try {
    Regex regexObj = new Regex(@"[^\d]");
    resultString = regexObj.Replace(subjectString, "");
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}
57
Brian Boatright

Ich weiß nicht, ob VBScript über eine Funktion zum Ersetzen von regulären Ausdrücken verfügt. Wenn dies der Fall ist, können Sie etwas wie diesen Pseudocode verwenden:

reg_replace(/\D+/g, '', your_string)

Ich kenne VBScript nicht, daher kann ich Ihnen nicht den genauen Code geben, aber dies würde alles entfernen, das keine Zahl ist.

BEARBEITEN: Vergewissern Sie sich, dass das globale Flag (das "g" am Ende des regulären Ausdrucks) vorhanden ist. Andernfalls wird nur die erste Nicht-Nummer in Ihrer Zeichenfolge angegeben.

11
Sasha Chedygov

In .NET könnten Sie nur die Ziffern aus der Zeichenfolge extrahieren. So was:

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
169
Matt Hamilton

Hinweis: Sie haben hier nur die Hälfte des Problems gelöst.

Für US-Telefonnummern, die "in der Wildnis" eingegeben wurden, können Sie Folgendes haben:

  • Rufnummern mit oder ohne Präfix "1"
  • Telefonnummern mit oder ohne Vorwahl
  • Telefonnummern mit Durchwahlnummern (wenn Sie alle Nicht-Ziffern blind entfernen, werden Sie das "x" oder "Ext." Oder was auch immer in der Leitung fehlen) fehlen.
  • Möglicherweise mit mnemonischen Buchstaben codierte Zahlen (800-BUY-THIS oder was auch immer)

Sie müssen Ihrem Code einige intelligente Funktionen hinzufügen, um die Ergebnisliste der Ziffern an einen einzigen Standard anzupassen, nach dem Sie tatsächlich in Ihrer Datenbank suchen.

Einige einfache Dinge, die Sie tun könnten, um das Problem zu beheben:

  • Prüfen Sie vor dem Entfernen von Nicht-Ziffern durch RegEx, ob die Zeichenfolge ein "x" enthält. Wenn ja, hacken Sie alles ab (erledigt die meisten Versionen des Schreibens einer Nebenstellennummer). 

  • Bei einer Zahl mit mehr als 10 Ziffern, die mit einer "1" beginnt, die 1 abhacken. Sie ist nicht Teil der Vorwahl.

  • Nehmen Sie für jede Zahl, die noch 10 Ziffern überschreitet, an, dass der Rest eine Erweiterung ist, und hacken Sie sie ab.

  • Führen Sie Ihre Datenbanksuche mit einer "Ends-with" -Mustersuche durch (SELECT * FROM mytable WHERE Telefonnummer wie "blah%"). Dies behandelt Positionen (wenn auch mit der Möglichkeit eines Fehlers), bei denen die Vorwahl nicht angegeben ist, Ihre Datenbank jedoch die Nummer mit die Vorwahl hat.

6
richardtallent

Als Alternative zur .Net-Hauptlösung, angepasst an eine ähnliche Frage Antwort:

string justNumbers = string.Concat(text.Where(char.IsDigit));
5
Teodor Tite

Wie es aussieht, versuchen Sie, eine beliebige 10-stellige Telefonnummer zu fangen.

Warum ersetzen Sie eine Zeichenfolge nicht zuerst im Text, um eines der folgenden Zeichen zu entfernen?.

<SPACE> , . ( ) - [ ] 

Danach können Sie einfach eine Regex-Suche nach einer 10-stelligen Zahl durchführen.

\d{10}
1
Eoin Campbell

In Bezug auf die von richardtallent angesprochenen Punkte wird dieser Code die meisten Ihrer Probleme in Bezug auf Nebenstellennummern und den US-Ländercode (+1) vorbereiten. 

Nicht die eleganteste Lösung, aber ich musste das Problem schnell lösen, damit ich meine Arbeit fortsetzen konnte.

Ich hoffe es hilft jemandem.

 Public Shared Function JustNumbers(inputString As String) As String
        Dim outString As String = ""
        Dim nEnds As Integer = -1

        ' Cycle through and test the ASCII character code of each character in the string. Remove everything non-numeric except "x" (in the event an extension is in the string as follows):
        '    331-123-3451 extension 405  becomes 3311233451x405
        '    226-123-4567 ext 405        becomes 2261234567x405
        '    226-123-4567 x 405          becomes 2261234567x405
        For l = 1 To inputString.Length
            Dim tmp As String = Mid(inputString, l, 1)
            If (Asc(tmp) >= 48 And Asc(tmp) <= 57) Then
                outString &= tmp
            ElseIf Asc(tmp.ToLower) = 120
                outString &= tmp
                nEnds = l
            End If
        Next


        ' Remove the leading US country code 1 after doing some validation
        If outString.Length > 0 Then
            If Strings.Left(outString, 1) = "1" Then

                ' If the nEnds flag is still -1, that means no extension was added above, set it to the full length of the string
                ' otherwise, an extension number was detected, and that should be the nEnds (number ends) position.
                If nEnds = -1 Then nEnds = outString.Length

                ' We hit a 10+ digit phone number, this means an area code is prefixed; 
                ' Remove the trailing 1 in case someone put in the US country code
                ' This is technically safe, since there are no US area codes that start with a 1. The start digits are 2-9
                If nEnds > 10 Then
                    outString = Right(outString, outString.Length - 1)
                End If
            End If
        End If

        Debug.Print(inputString + "          : became : " + outString)

        Return outString
    End Function
0
user4914655

Haben Sie die phone nr category auf regexlib durchgegangen. Sieht so aus, als ob einige das tun, was Sie brauchen.

0
Ólafur Waage