Share via


Solucionar problemas de expresiones regulares en Visual Basic

En este tema se tratan algunos problemas habituales que se pueden producir al trabajar con expresiones regulares, se proporcionan algunas sugerencias para solucionar estos problemas y se proporciona un procedimiento para obtener acceso a cadenas capturadas.

Sin coincidencia con el patrón esperado

A continuación se indican algunas tareas comunes que puede realizar con expresiones regulares, así como sugerencias para solucionar problemas si no obtiene los resultados que espera:

  • Validación de las cadenas. Una expresión regular de validación de cadenas debe comenzar con el carácter ^. Esto indica al motor de la expresión regular que inicie la concordancia con el patrón especificado en el inicio de la cadena. Para obtener más información, vea Crear una función de validación en Visual Basic. y Delimitadores en expresiones regulares.

  • Coincidencia con cuantificadores. Los cuantificadores de expresión regular (*, +, ?, {}) son expansivos, es decir, coinciden con la cadena más larga posible. Sin embargo, en algunos patrones puede preferir utilizar una coincidencia no expansiva para obtener la cadena más corta posible. Los cuantificadores de expresión regular no expansivos son *?, +?, ?? y {}?. Para obtener más información, vea Cuantificadores.

  • Coincidencia con cuantificadores anidados. Cuando utilice cuantificadores anidados, debe asegurarse de que todos los cuantificadores son expansivos o no expansivos. De lo contrario, los resultados de la coincidencia serán difíciles de predecir.

Acceso a cadenas capturadas

Cuando una expresión regular localiza las cadenas esperadas, puede desear capturar esas cadenas y a continuación, tener acceso a lo capturado. Puede utilizar estructuras de agrupación para capturar las cadenas que coinciden con grupos de subexpresiones de la expresión regular. Para obtener más información, vea Construcciones de agrupamiento.

El acceso a cadenas capturadas con grupos anidados implica varios pasos.

Para tener acceso a texto capturado

  1. Cree un objeto Regex para una expresión regular.

  2. Llame al método Match para obtener el objeto Match.

    El objeto Match contiene información sobre cómo la expresión regular coincide con la cadena.

  3. Recorra en iteración los objetos Group almacenados en la colección Groups del objeto Match.

    El objeto Group contiene información sobre el resultado de un único grupo de capturas.

  4. Recorra en iteración los objetos Capture almacenados en la colección Captures de cada objeto Group.

    Cada objeto Capture contiene información sobre una única subexpresión capturada, incluida la subcadena coincidente y la ubicación.

Por ejemplo, el código siguiente muestra cómo tener acceso a las cadenas capturadas con una expresión regular que contiene tres grupos de captura:

    ''' <summary>
    ''' Parses an e-mail address into its parts.
    ''' </summary>
    ''' <param name="emailString">E-mail address to parse.</param>
    ''' <remarks> For example, this method displays the following 
    ''' text when called with "someone@mail.contoso.com":
    ''' User name: someone
    ''' Address part: mail
    ''' Address part: contoso
    ''' Address part: com
    ''' </remarks>
    Sub ParseEmailAddress(ByVal emailString As String)
        Dim emailRegEx As New Regex("(\S+)@([^\.\s]+)(?:\.([^\.\s]+))+")
        Dim m As Match = emailRegEx.Match(emailString)
        If m.Success Then
            Dim output As String = ""
            output &= "User name: " & m.Groups(1).Value & vbCrLf
            For i As Integer = 2 To m.Groups.Count - 1
                Dim g As Group = m.Groups(i)
                For Each c As Capture In g.Captures
                    output &= "Address part: " & c.Value & vbCrLf
                Next
            Next
            MsgBox(output)
        Else
            MsgBox("The e-mail address cannot be parsed.")
        End If
    End Sub

Vea también

Tareas

Solucionar problemas de cadenas en Visual Basic

Conceptos

Crear una función de validación en Visual Basic