Подтвердить что ты не робот

Выражение основных критериев запроса доступа в виде регулярных выражений

Я знаком с критериями запроса и фильтрами доступа, но я не уверен, как выражать подобные утверждения как шаблоны регулярных выражений. Мне интересно, может ли кто-то помочь связать их с некоторыми легкими примерами, которые я понимаю.

Если бы я использовал регулярные выражения для сопоставления таких полей, как Access, как бы я мог выражать следующие утверждения? Примеры аналогичны тем, которые были найдены на веб-странице Access Query and Filter Criteria. Как и в Access, регистр нечувствителен.

  • "London"

    Строки, которые точно соответствуют слову London.

  • "Лондон" или "Париж"

    Строки, которые точно соответствуют словам Лондона или Парижа.

  • Не "Лондон"

    Любая строка, кроме Лондона.

  • Как "S *"

    Любая строка, начинающаяся с буквы s.

  • Как "* st"

    Любая строка, заканчивающаяся буквами st.

  • Как "* the * dog *"

    Любые строки, содержащие слова "the" и "dog" с любыми символами до, между ними или в конце.

  • Как "[A-D] *"

    Любые строки, начинающиеся с букв от A до D, за которыми следует что-то еще.

  • Не нравится "* Лондон *"

    Любые строки, которые нигде не содержат слова London.

  • Не нравится "L *"

    Любые строки, которые не начинаются с буквы L.

  • Как "L *" и не нравится "London *"

    Любые строки, начинающиеся с буквы L, но не слова London.

4b9b3361

Ответ 1

Regex намного эффективнее любого из шаблонов, к которым вы привыкли создавать критерии в Access SQL. Если вы ограничиваете себя этими типами шаблонов, вы пропустите большинство действительно интересных функций регулярных выражений.

Например, вы не можете искать такие вещи, как даты или извлечение IP-адресов, простое обнаружение или проверку электронной почты или URL-адресов, проверку базового ссылочного кода (например, вопрос о том, следует ли код заказа для заказа следовать заданной структуре кодирования, скажите что-то вроде PO123/C456 например) и т.д.

Как упоминалось в @Smandoli, вы должны забыть свои предубеждения относительно соответствия шаблонов и погружения в язык регулярных выражений.

Я нашел книгу Освоение регулярных выражений бесценной, но инструменты лучше всего экспериментировать свободно с шаблонами регулярных выражений; Я использую RegexBuddy, но есть другие доступные инструменты.

Основные совпадения

Теперь, в отношении вашего списка, и используя довольно стандартизованный синтаксис регулярных выражений:

  • "London"

    Строки, которые точно соответствуют слову London.

    ^London$

  • "Лондон" или "Париж"

    Строки, которые точно соответствуют словам Лондона или Парижа.

    ^(London|Paris)$

  • Не "Лондон"

    Любая строка, кроме Лондона.

    Вы сопоставляете ^London$ и инвертируете результат (NOT)

  • Как "S *"

    Любая строка, начинающаяся с буквы s.

    ^s

  • Как "* st"

    Любая строка, заканчивающаяся буквами st.

    st$

  • Как "* the * dog *"

    Любые строки, содержащие слова "the" и "dog" с любыми символами до, между ними или в конце.

    the.*dog

  • Как "[A-D] *"

    Любые строки, начинающиеся с букв A-D, за которыми следует что-то еще.

    ^[A-D]

  • Не нравится "* Лондон *"

    Любые строки, которые нигде не содержат слова London.

    Обратный результат сопоставления для London (вы можете использовать негативный просмотр, например:
    ^(.(?!London))*$, но я не думаю, что он доступен для более основного механизма Regex, доступного для Access).

  • Не нравится "L *"

    Любые строки, которые не начинаются с L.

    ^[^L] отрицательное соответствие для одиночных символов проще, чем отрицательное соответствие для целого слова, как мы видели выше.

  • Как "L *" и не нравится "London *"

    Любые строки, начинающиеся с буквы L, но не слова London.

    ^L(?!ondon).*$

Использование регулярных выражений в критериях SQL

В Access легко создать пользовательскую функцию, которая может использоваться непосредственно в SQL-запросах. Чтобы использовать регулярное выражение в ваших запросах, поместите эту функцию в модуль:

' ----------------------------------------------------------------------'
' 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

Затем вы можете использовать его в своих критериях запроса, например, чтобы найти в таблице PartTable все части, которые соответствуют вариантам screw 18mm, например Pan Head Screw length 18 mm или даже SCREW18mm и т.д.

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

Caveat

  • Поскольку сопоставление регулярных выражений использует старые библиотеки сценариев, аромат языка Regex немного более ограничен, чем тот, который найден в .Net, доступный для других языков программирования.
    Он все еще довольно мощный, поскольку он более или менее такой же, как тот, который используется JavaScript.
    Читайте о Vexcript-движке Vexcript, чтобы проверить, что вы можете и чего не можете сделать.

  • Хуже, но вероятно, что соответствие регулярному выражению с использованием этой библиотеки довольно медленное, и вы должны быть очень осторожны, чтобы не злоупотреблять им.

Тем не менее, это может быть очень полезно иногда. Например, я использовал регулярные выражения для дезинфекции ввода данных от пользователей и обнаружения записей с похожими шаблонами, которые должны были быть нормализованы.
Хорошо используемые регулярные выражения могут улучшить согласованность данных, но использовать экономно.

Ответ 2

Regex трудно взломать изначально. Честно говоря, поиск примеров с ложкой не поможет, так как "грязные руки" с ним. Кроме того, MS Access не является хорошим трамплином. Regex не хорошо "разбирается" с процессом запросов SQL - не в приложении, а не в ментальной ориентации. Вам нужны текстовые файлы для обработки, используя текстовый редактор.

Ответ 3

Наше решение состояло в том, чтобы открыть файл Excel в OpenCalc (часть Apache OpenOffice, https://www.openoffice.org/), который обеспечивает то, что кажется полными регулярными выражениями как для поиска, так и для замены.

Мы проверяем регулярные выражения на http://regexr.com/