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

3

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

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

"London"

Strings that match the word London exactly.

"London" or "Paris"

Strings that match either the words London or Paris exactly.

Not "London"

Any string but London.

Like "S*"

Any string beginning with the letter s.

Like "*st"

Any string ending with the letters st.

Like "*the*dog*"

Any strings that contain the words 'the' and 'dog' with any characters before, in between, or at the end.

Like "[A-D]*"

Any strings beginning with the letters A through D, followed by anything else.

Not Like "*London*"

Any strings that do not contain the word London anywhere.

Not Like "L*"

Any strings that don't begin with an L.

Like "L*" And Not Like "London*"

Any strings that begin with the letter L but not the word London.

& # x2026; на каком языке? Например, Javascript RegExp не имеет (neg / pos) внешнего вида, в то время как в PHP это намного больше. inhan

Ваш Ответ

3   ответа
14

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

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

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

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

Basic matches

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

  1. "London"

    Strings that match the word London exactly.

    ^London$

  2. "London" or "Paris"

    Strings that match either the words London or Paris exactly.

    ^(London|Paris)$

  3. Not "London"

    Any string but London.

    You match for ^London$ and invert the result (NOT)

  4. Like "S*"

    Any string beginning with the letter s.

    ^s

  5. Like "*st"

    Any string ending with the letters st.

    st$

  6. Like "*the*dog*"

    Any strings that contain the words 'the' and 'dog' with any characters before, in between, or at the end.

    the.*dog

  7. Like "[A-D]*"

    Any strings beginning with the letters A through D, followed by anything else.

    ^[A-D]

  8. Not Like "*London*"

    Any strings that do not contain the word London anywhere.

    Reverse the matching result for London (you can use negative lookahead like:
    ^(.(?!London))*$, but I don't think it's available to the more basic Regex engine available to Access).

  9. Not Like "L*"

    Any strings that don't begin with an L.

    ^[^L] negative matching for single characters is easier than negative matching for a whole word as we've seen above.

  10. Like "L*" And Not Like "London*"

    Any strings that begin with the letter L but not the word London.

    ^L(?!ondon).*$

Using Regexes in SQL Criteria

В 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

  • Because the regex matching uses old scripting libraries, the flavour of Regex language is a bit more limited than the one found in .Net available to other programming languages.
    It's still fairly powerful as it is more or less the same as the one used by JavaScript.
    Read about the VBScript regex engine to check what you can and cannot do.

  • The worse though, is probably that the regex matching using this library is fairly slow and you should be very careful not to overuse it.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededveryError: User Rate Limit Exceeded regulus
0

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

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

3

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded regulus
Error: User Rate Limit Exceeded regulus

Похожие вопросы