Ответ 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, чтобы проверить, что вы можете и чего не можете сделать. -
Хуже, но вероятно, что соответствие регулярному выражению с использованием этой библиотеки довольно медленное, и вы должны быть очень осторожны, чтобы не злоупотреблять им.
Тем не менее, это может быть очень полезно иногда. Например, я использовал регулярные выражения для дезинфекции ввода данных от пользователей и обнаружения записей с похожими шаблонами, которые должны были быть нормализованы.
Хорошо используемые регулярные выражения могут улучшить согласованность данных, но использовать экономно.