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
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
}
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.
Dans .NET, vous pouvez extraire uniquement les chiffres de la chaîne. Comme ça:
string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
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:
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.
Comme alternative à la solution principale .Net
, adaptée d'une question similaire réponse
string justNumbers = string.Concat(text.Where(char.IsDigit));
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}
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
Avez-vous parcouru la catégorie phone nr sur regexlib. On dirait que beaucoup font ce dont vous avez besoin.