Expresar los criterios básicos de consulta de acceso como expresiones regulares

Estoy familiarizado con la consulta de Access y los criterios de filtro, pero no estoy seguro de cómo express declaraciones similares a patrones de expresiones regulares. Me pregunto si alguien puede ayudar a relacionarlos con algunos ejemplos fáciles que entiendo.

Si estuviera usando expresiones regulares para hacer coincidir campos como Access, ¿cómo expressía las siguientes afirmaciones? Los ejemplos son similares a los encontrados en esta página web de Consulta de acceso y Criterios de filtro . Como en Access, el caso es insensible.

  1. “Londres”

    Las cadenas que coinciden con la palabra London exactamente.

  2. “Londres” o “París”

    Las cadenas que coinciden con las palabras Londres o París exactamente.

  3. No es “Londres”

    Cualquier cadena excepto Londres.

  4. Gustos*”

    Cualquier cadena que comience con la letra s.

  5. Me gusta “* st”

    Cualquier cadena que termine con las letras st.

  6. Me gusta “* the * dog *”

    Cualquier cadena que contenga las palabras ‘the’ y ‘dog’ con cualquier carácter anterior, intermedio o final.

  7. Me gusta “[AD] *”

    Cualquier cadena que comience con las letras A a D, seguida de cualquier otra cosa.

  8. No me gusta “* Londres *”

    Cualquier cadena que no contenga la palabra London en cualquier lugar.

  9. No me gusta “L *”

    Cualquier cadena que no comience con L.

  10. Me gusta “L *” y no me gusta “Londres *”

    Cualquier cadena que comience con la letra L pero no con la palabra London.

Regex es mucho más poderoso que cualquiera de los patrones a los que ha estado acostumbrado para crear criterios en Access SQL. Si te limitas a este tipo de patrones, te perderás la mayoría de las características realmente interesantes de las expresiones regulares.

Por ejemplo, no puede buscar cosas como fechas o extraer direcciones IP, correo electrónico simple o detección o validación de URL, validación de código de referencia básica (como preguntar si un código de referencia de pedido sigue una estructura de encoding obligatoria, decir algo como PO123/C456 por ejemplo), etc.

Como mencionó @Smandoli, será mejor que olvide sus ideas preconcebidas sobre la coincidencia de patrones y profundice en el lenguaje de expresiones regulares.

Considero que el libro Mastering Regular Expressions es invaluable, pero las herramientas son las mejores para experimentar libremente con patrones de expresiones regulares ; Yo uso RegexBuddy , pero hay otras herramientas disponibles .

Partidos básicos

Ahora, con respecto a su lista, y usando syntax de expresión regular bastante estandarizada:

  1. “Londres”

    Las cadenas que coinciden con la palabra London exactamente.

    ^London$

  2. “Londres” o “París”

    Las cadenas que coinciden con las palabras Londres o París exactamente.

    ^(London|Paris)$

  3. No es “Londres”

    Cualquier cadena excepto Londres.

    Combina con ^London$ e invierte el resultado ( NOT )

  4. Gustos*”

    Cualquier cadena que comience con la letra s.

    ^s

  5. Me gusta “* st”

    Cualquier cadena que termine con las letras st.

    st$

  6. Me gusta “* the * dog *”

    Cualquier cadena que contenga las palabras ‘the’ y ‘dog’ con cualquier carácter anterior, intermedio o final.

    the.*dog

  7. Me gusta “[AD] *”

    Cualquier cadena que comience con las letras A a D, seguida de cualquier otra cosa.

    ^[AD]

  8. No me gusta “* Londres *”

    Cualquier cadena que no contenga la palabra London en cualquier lugar.

    Invierta el resultado coincidente para London (puede usar un lookahead negativo como:
    ^(.(?!London))*$ , pero no creo que esté disponible para el motor Regex más básico disponible para Access).

  9. No me gusta “L *”

    Cualquier cadena que no comience con L.

    ^[^L] la coincidencia negativa para caracteres individuales es más fácil que la concordancia negativa para una palabra completa como hemos visto anteriormente.

  10. Me gusta “L *” y no me gusta “Londres *”

    Cualquier cadena que comience con la letra L pero no con la palabra London.

    ^L(?!ondon).*$

Usar Regexes en SQL Criteria

En Access, crear una función definida por el usuario que se pueda usar directamente en consultas SQL es fácil.
Para usar la coincidencia de expresiones regulares en sus consultas, coloque esta función en un módulo:

 ' ----------------------------------------------------------------------' ' Return True if the given string value matches the given Regex pattern ' ' ----------------------------------------------------------------------' Public Function RegexMatch(value As Variant, pattern As String) As Boolean If IsNull(value) Then Exit Function ' Using a static, we avoid re-creating the same regex object for every call ' Static regex As Object ' Initialise the Regex object ' If regex Is Nothing Then Set regex = CreateObject("vbscript.regexp") With regex .Global = True .IgnoreCase = True .MultiLine = True End With End If ' Update the regex pattern if it has changed since last time we were called ' If regex.pattern <> pattern Then regex.pattern = pattern ' Test the value against the pattern ' RegexMatch = regex.test(value) End Function 

Luego puede usarlo en sus criterios de consulta, por ejemplo para encontrar en una tabla PartTable , todas las partes que coinciden con variaciones de screw 18mm como la Pan Head Screw length 18 mm SCREW18mm Pan Head Screw length 18 mm o incluso el SCREW18mm Pan Head Screw length 18 mm , etc.

 SELECT PartNumber, Description FROM PartTable WHERE RegexMatch(Description, "screw.*?d+\s*mm") 

Advertencia

  • Debido a que la comparación de expresiones regulares usa bibliotecas de secuencias de comandos antiguas, el sabor del lenguaje Regex es un poco más limitado que el que se encuentra en .Net disponible para otros lenguajes de progtwigción.
    Todavía es bastante potente ya que es más o menos el mismo que usa JavaScript.
    Lea sobre el motor de expresiones referenciales de VBScript para verificar qué puede y qué no puede hacer.

  • Lo peor, sin embargo, es que probablemente la coincidencia de expresiones regulares con esta biblioteca sea bastante lenta y debes tener mucho cuidado de no abusar de ella.

Dicho esto, a veces puede ser muy útil. Por ejemplo, usé expresiones regulares para desinfectar las entradas de datos de los usuarios y detectar entradas con patrones similares que deberían haberse normalizado.
Bien utilizado, las expresiones regulares pueden mejorar la coherencia de los datos, pero se usan con moderación.

Regex es difícil de romper inicialmente. Honestamente, buscar ejemplos alimentados con cuchara no ayudará tanto como “ensuciarse las manos” con eso. Además, MS Access no es un buen trampolín. Regex no “cognate” bien con el proceso de consulta SQL, no en la aplicación, y no en la orientación mental. Lo que necesita son algunos archivos de texto para procesar, usando un editor de texto.

Nuestra solución fue abrir el archivo de Excel en OpenCalc (parte de Apache OpenOffice, https://www.openoffice.org/ ), que proporciona lo que parecen expresiones regulares completas para buscar y reemplazar.

Probamos las expresiones regulares en http://regexr.com/