restituisce solo le cifre 0-9 da una stringa

Ho bisogno di un’espressione regolare che possa essere utilizzata in VBScript e .NET per restituire solo i numeri che si trovano in una stringa.

Ad esempio, una delle seguenti “stringhe” deve restituire solo 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

Questo verrà utilizzato in un parser di posta elettronica per trovare i numeri di telefono che i clienti possono fornire nell’e-mail e fare una ricerca nel database.

Potrei aver perso una regex simile ma ho cercato su regexlib.com.

[EDIT] – Aggiunto il codice generato da RegexBuddy dopo aver impostato la risposta di musicfreak

Codice 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 } 

Non so se VBScript abbia una sorta di funzione di “espressione regolare sostitutiva”, ma se lo fa, allora potresti fare qualcosa come questo pseudocodice:

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

Non conosco VBScript, quindi non posso darti il ​​codice esatto, ma rimuoverei tutto ciò che non è un numero.

EDIT: Assicurati di avere il flag globale (la “g” alla fine della regexp), altrimenti si abbinerà solo al primo non-numero della tua stringa.

In .NET, è ansible estrarre solo le cifre dalla stringa. Come questo:

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

Nota: hai risolto solo metà del problema qui.

Per i numeri di telefono statunitensi inseriti “in the wild”, potresti avere:

  • Numeri di telefono con o senza il prefisso “1”
  • Numeri di telefono con o senza prefisso
  • Numeri di telefono con numeri di interno (se rimuovi ciecamente tutti i numeri non digitati, perderai “x” o “Ext.” O qualsiasi altra cosa sulla linea).
  • Possibilmente, numeri codificati con lettere mnemoniche (800-BUY-THIS o qualsiasi altra cosa)

Avrai bisogno di aggiungere alcune intelligenze al tuo codice per conformare l’elenco risultante di cifre a un singolo standard che cerchi effettivamente nel tuo database.

Alcune semplici cose che potresti fare per risolvere questo problema:

  • Prima della rimozione RegEx di non cifre, vedere se c’è una “x” nella stringa. Se c’è, tritare tutto dopo di esso (gestirà la maggior parte delle versioni di scrittura di un numero di interno).

  • Per qualsiasi numero con 10+ cifre che iniziano con un “1”, tagliare il 1. Non fa parte del prefisso, i codici area statunitensi iniziano nella gamma 2xx.

  • Per qualsiasi numero ancora superiore a 10 cifre, supponiamo che il resto sia un’estensione di qualche tipo e taglialo.

  • Effettua la ricerca del tuo database utilizzando una ricerca di modelli “termina con” (SELEZIONA * DA mytable WHERE phonenumber LIKE ‘blah%’). Questo gestirà le sitazioni (anche se con possibilità di errore) in cui il prefisso non viene fornito, ma il tuo database ha il numero con il prefisso.

In alternativa alla principale soluzione .Net , adattata dalla risposta di una domanda simile :

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

Dall’aspetto delle cose, il tuo tentativo di catturare qualsiasi numero di telefono a 10 cifre ….

Perché non fare una stringa sostituire prima di tutto sul testo per rimuovere uno dei seguenti caratteri.

  , . ( ) - [ ] 

Successivamente, puoi eseguire una ricerca regolare per un numero di 10 cifre.

 \d{10} 

Hai passato attraverso la categoria di telefono su regexlib. Sembra che alcuni facciano ciò di cui hai bisogno.

Rispetto ai punti fatti da richardtallent, questo codice gestirà la maggior parte dei tuoi problemi in relazione ai numeri degli interni, e il codice del paese degli Stati Uniti (+1) è preposto.

Non è la soluzione più elegante, ma ho dovuto risolvere rapidamente il problema in modo da poter andare avanti con quello che sto facendo.

Spero che aiuti qualcuno.

  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