Казалось бы, простая проблема. Мне нужно найти те записи, где «длинный текст» field1 в таблице notes содержит строки, начинающиеся с -» (т. е. дефис и двойные кавычки), используя регулярные выражения VBA в SQL. (field1 использует расширенное форматирование текста (таблица и поле формы). При необходимости я мог бы его опустить, но в моем контексте полезно иметь форматированный текст).
Двойная кавычка сохраняется как ее HTML-объект " и может быть отменена с помощью PLAINTEXT() функции.
Чтобы упростить задачу, я начинаю с простой попытки сопоставить поля, содержащие любые символы кавычек: Я без проблем могу найти поля, содержащие одинарную кавычку:
SELECT *
FROM notes
WHERE RegexMatch(field1, ".*'.*")
;
но это не удается с двойной кавычкой
SELECT *
FROM notes
WHERE RegexMatch(field1, ".*"".*")
;
Где я пытаюсь избежать символа кавычки с помощью другой цитаты. Что я делаю не так? Я также вставил свою функцию RegexMatch() на случай, если это актуально.
' ----------------------------------------------------------------------'
' 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
Большое спасибо за вашу помощь
Запрос теперь работает хорошо:
SELECT *
FROM notes
WHERE RegexMatch(PLAINTEXT(notes.field1), "-""")
;
Странный. Вы не используете опцию форматирования текста для этого длинного текстового поля, верно? Кроме того, если это ваш реальный вариант использования, его можно легко заменить оператором LIKE, обеспечивающим лучшую производительность и лучшую совместимость.
Спасибо, это богатое текстовое поле. В шаблоне отладки отображается .*".* для нерабочего шаблона и .*'.* для рабочего шаблона одинарной кавычки. Кстати, утверждение LIKE создает точно такую же проблему. В БД всего около 10 тысяч записей, и производительность регулярных выражений в порядке, и я хотел использовать это, потому что мне нужны и другие регулярные выражения, поэтому мне нужно было более общее решение, как правильно сопоставить " в моей ситуации.
Чтобы проиллюстрировать ту же проблему без регулярного выражения: WHERE field1 LIKE "*""*" не соответствует и WHERE notes LIKE "*'*" соответствует. Поле1 содержит как одинарные, так и двойные кавычки.


Если столбец использует формат Rich Text, то " внутри сохраняется как ".
Любой запрос к этому столбцу будет работать с исходным текстом HTML, а не с форматированным HTML.
Вы можете просмотреть исходный текст, создав форму на основе таблицы с текстовым полем для поля, которое имеет TextBox.TextFormat = Plain Text.
Эрик А. делает очень хорошее замечание в комментарии:
Вы можете использовать функцию PlainText для запроса простого текстового представления форматированного текста.
Затем вы можете использовать это для запроса двойных кавычек:
WHERE PlainText(fld) LIKE "*""*"
или
WHERE PlainText(fld) LIKE '*"*'
Спасибо, это работает как шарм. Поначалу трудно узнать эти детали. Например, сопоставление одинарных кавычек работает, даже если его HTML-объект — '. Таким образом, в полях форматированного текста сохраняется одинарная кавычка ', но вдвойне " полезно знать. Не знаю, почему вопрос был отклонен, но надеюсь, что это может быть полезно для кого-то еще.
При работе с форматированным текстом в запросах лучше всего использовать функцию PLAINTEXT, чтобы получить представление в виде простого текста вместо поиска по ". Это позволяет избежать запроса, возвращающего строки с кавычками в атрибутах (например, если какой-то текст имеет гиперссылку, содержащую кавычку в URL-адресе). Предполагая, что вы хотите искать реальные цитаты и игнорировать атрибуты.
Спасибо @ErikA, я совсем забыл об этом.
Показывает ли
Debug.Print patternправильную строку шаблона?