web-dev-qa-db-fra.com

renvoyer uniquement les chiffres 0 à 9 d'une chaîne

J'ai besoin d'une expression régulière que je puisse utiliser dans VBScript et .NET pour renvoyer uniquement les nombres trouvés dans une chaîne. 

Par exemple, l’une des "chaînes" suivantes ne doit renvoyer que 1231231234

  • 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

Ceci sera utilisé dans un analyseur de courrier électronique pour rechercher les numéros de téléphone que les clients peuvent fournir dans le courrier électronique et effectuer une recherche dans la base de données.

J'ai peut-être manqué une expression régulière similaire, mais j'ai effectué une recherche sur regexlib.com.

[EDIT] - Code ajouté généré par RegexBuddy après avoir configuré la réponse de musicfreak

Code VBScript

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

Je ne sais pas si VBScript a une sorte de fonction de "remplacement d'expressions régulières", mais si c'est le cas, vous pouvez faire quelque chose comme ce pseudo-code:

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

Je ne connais pas VBScript, je ne peux donc pas vous donner le code exact, mais cela supprimerait tout ce qui ne serait pas un chiffre.

EDIT: Assurez-vous d’avoir le drapeau global (le "g" à la fin de l’expression rationnelle), sinon il ne correspondra qu'au premier non-nombre de votre chaîne.

11
Sasha Chedygov

Dans .NET, vous pouvez extraire uniquement les chiffres de la chaîne. Comme ça:

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

Remarque: vous n'avez résolu que la moitié du problème ici.

Pour les numéros de téléphone américains entrés "dans la nature", vous pouvez avoir:

  • Numéros de téléphone avec ou sans le préfixe "1"
  • Numéros de téléphone avec ou sans l'indicatif régional
  • Numéros de téléphone avec numéros de poste (si vous supprimez aveuglément tous les non-chiffres, vous manquerez le "x" ou le "Ext." Ou autre chose également sur la ligne).
  • Éventuellement, des chiffres encodés avec des lettres mnémoniques (800-BUY-THIS ou autre)

Vous devrez ajouter quelques connaissances intelligentes à votre code pour que la liste de chiffres résultante soit conforme à une norme unique que vous recherchez réellement dans votre base de données.

Quelques choses simples que vous pourriez faire pour résoudre ce problème:

  • Avant de supprimer RegEx des non-chiffres, voyez s'il y a un "x" dans la chaîne. Si tel est le cas, supprimez tout ce qui suit après (supprimez la plupart des versions de l'écriture d'un numéro de poste). 

  • Pour tout nombre de 10 chiffres ou plus commençant par "1", coupez le 1. Cela ne fait pas partie de l'indicatif régional, les indicatifs régionaux américains commencent dans la plage 2xx.

  • Pour tout nombre dépassant encore 10 chiffres, supposez que le reste est une extension, et coupez-le.

  • Effectuez une recherche dans la base de données en utilisant une recherche de modèle "se termine avec" (SELECT * FROM mytable WHERE numéro de téléphone LIKE "blah%"). Ceci gérera les sitations (avec possibilité d'erreur) lorsque l'indicatif régional n'est pas fourni, mais que votre base de données porte le numéro avec l'indicatif régional.

6
richardtallent

Comme alternative à la solution principale .Net, adaptée d'une question similaire réponse

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

En apparence, vous essayez de saisir un numéro de téléphone à 10 chiffres ....

Pourquoi ne pas faire une chaîne remplacer d'abord sur le texte pour supprimer l'un des caractères suivants.

<SPACE> , . ( ) - [ ] 

Ensuite, vous pouvez simplement faire une recherche régulière sur un numéro à 10 chiffres.

\d{10}
1
Eoin Campbell

En ce qui concerne les remarques faites par richardtallent, ce code gérera la plupart de vos problèmes en ce qui concerne les numéros de poste et l'indicatif de pays des États-Unis (+1) ajouté au début. 

Ce n’est pas la solution la plus élégante, mais j’ai dû résoudre rapidement le problème pour pouvoir continuer avec ce que je faisais.

J'espère que ça aide quelqu'un.

 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

Avez-vous parcouru la catégorie phone nr sur regexlib. On dirait que beaucoup font ce dont vous avez besoin.

0
Ólafur Waage