devolver solo los dígitos 0-9 de una cadena

Necesito una expresión regular que pueda usar en VBScript y .NET que devolverá solo los números que se encuentran en una cadena.

Por ejemplo, cualquiera de las siguientes “cadenas” debería devolver 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

Esto se usará en un analizador de correo electrónico para encontrar los números de teléfono que los clientes pueden proporcionar en el correo electrónico y realizar una búsqueda en la base de datos.

Puede que me haya perdido una expresión regular similar, pero busqué en regexlib.com.

[EDIT] – Se agregó el código generado por RegexBuddy después de configurar la respuesta de musicfreak

Código 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 

DO#

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

No sé si VBScript tiene algún tipo de función de “sustitución de expresiones regulares”, pero si lo hace, entonces podría hacer algo como este pseudocódigo:

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

No conozco VBScript, así que no puedo darte el código exacto, pero esto eliminaría cualquier cosa que no sea un número.

EDITAR: Asegúrate de tener la bandera global (la “g” al final de la expresión regular), de lo contrario solo coincidirá con el primer número que no esté en tu cadena.

En .NET, puedes extraer solo los dígitos de la cadena. Me gusta esto:

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

Nota: aquí solo ha resuelto la mitad del problema.

Para los números de teléfono de EE. UU. Ingresados ​​”en la naturaleza”, es posible que tenga:

  • Números de teléfono con o sin el prefijo “1”
  • Números de teléfono con o sin el código de área
  • Números de teléfono con números de extensión (si elimina ciegamente todos los que no son dígitos, perderá la “x” o “Ext.” O lo que sea que esté en la línea).
  • Posiblemente, números codificados con letras mnemotécnicas (800-BUY-THIS o lo que sea)

Necesitará agregar algo de inteligencia a su código para conformar la lista de dígitos resultante a un estándar único que realmente busca en su base de datos.

Algunas cosas simples que podrías hacer para arreglar esto:

  • Antes de la eliminación de RegEx de los no dígitos, vea si hay una “x” en la cadena. Si lo hay, corte todo después de eso (manejará la mayoría de las versiones de escribir un número de extensión).

  • Para cualquier número con más de 10 dígitos que comienza con un “1”, corte el 1. No forma parte del código de área, los códigos de área de EE. UU. Comienzan en el rango 2xx.

  • Para cualquier número que aún exceda los 10 dígitos, suponga que el rest es una extensión de algún tipo y córtelo.

  • Haga su búsqueda en la base de datos usando una búsqueda de patrón “ends-with” (SELECCIONE * FROM mytable WHERE phonenumber LIKE ‘blah%’). Esto manejará las notas (aunque con la posibilidad de error) donde no se proporciona el código de área, pero su base de datos tiene el número con el código de área.

Como una alternativa a la solución .Net principal, adaptada de la respuesta de una pregunta similar :

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

Por lo que parece, intentas atrapar cualquier número de teléfono de 10 dígitos …

¿Por qué no hacer una cadena reemplazar en primer lugar en el texto para eliminar cualquiera de los siguientes caracteres.

  , . ( ) - [ ] 

Luego, luego, puedes hacer una búsqueda de expresiones regulares para obtener un número de 10 dígitos.

 \d{10} 

¿Has pasado por la categoría de teléfono nr en regexlib? Parece que bastantes hacen lo que necesitas.

Con respecto a los puntos hechos por richardtallent, este código manejará la mayoría de sus problemas con respecto a los números de extensión, y el código de país de EE. UU. (+1) se antepone.

No es la solución más elegante, pero tuve que resolver rápidamente el problema para poder seguir con lo que estoy haciendo.

Espero que esto ayude a alguien.

  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