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


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

Por ejemplo, cualquiera de las siguientes "cadenas" debe 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 utilizará en un analizador de correo electrónico para encontrar el teléfono los números que los clientes pueden proporcionar en el correo electrónico y hacer una búsqueda en la base de datos.

Puede que me haya perdido una expresión regular similar, pero lo hice buscar en regexlib.com.

[EDITAR] - Se agregó 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

C#

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

7 answers

No se si VBScript tiene algún tipo de función de "reemplazo de expresión regular", pero si lo hace, entonces podrías hacer algo como este pseudocódigo:

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

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

EDITAR: Asegúrese de tener la bandera global (la "g" al final de la expresión regular), de lo contrario solo coincidirá con el primer no número en su cadena.

 11
Author: Sasha Chedygov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-10 03:00:22

En.NET, puede extraer solo los dígitos de la cadena. Así:

string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
 163
Author: Matt Hamilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-27 11:20:47

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

Para los números de teléfono estadounidenses introducidos "en la naturaleza", puede tener:

  • 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 números que no sean dígitos, perderá la " x " o " Ext."o lo que sea también en la línea).
  • Posiblemente, números codificados con letras mnemotécnicas (800-BUY-THIS o lo que sea)

Necesita agregar algunas inteligencias a su código para conformar la lista resultante de dígitos a un solo estándar que realmente busca en su base de datos.

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

  • Antes de la eliminación de expresiones regulares de no dígitos, vea si hay una " x " en la cadena. Si lo hay, corta todo después de él (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 comiencen con un "1", corte el 1. No es parte del código de área, los códigos de área estadounidenses comienzan en el rango 2xx.

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

  • Haga su búsqueda en la base de datos usando un patrón de búsqueda "ends-with" (SELECCIONE * DE mytable DONDE phonenumber COMO ' blah%'). Esto manejará las ubicaciones (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.

 6
Author: richardtallent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-10 06:08:34

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

string justNumbers = string.Concat(text.Where(char.IsDigit));
 4
Author: Teodor Tite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:14

Por el aspecto de las cosas, su tratando de atrapar cualquier número de teléfono de 10 dígitos....

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

<SPACE> , . ( ) - [ ] 

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

\d{10}
 1
Author: Eoin Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-10 01:01:24

Has pasado por la categoría phone nr en regexlib. Parece que unos cuantos hacen lo que necesitas.

 0
Author: Ólafur Waage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-10 00:59:48

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.

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

Espero que 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
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-20 21:32:33