VBA Regex в MSAccess – поиск символа двойной кавычки

Казалось бы, простая проблема. Мне нужно найти те записи, где «длинный текст» field1 в таблице notes содержит строки, начинающиеся с -» (т. е. дефис и двойные кавычки), используя регулярные выражения VBA в SQL. (field1 использует расширенное форматирование текста (таблица и поле формы). При необходимости я мог бы его опустить, но в моем контексте полезно иметь форматированный текст).

TLDR;

Двойная кавычка сохраняется как ее 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), "-""")
;

Показывает ли Debug.Print pattern правильную строку шаблона?

Wiktor Stribiżew 16.05.2024 11:59

Странный. Вы не используете опцию форматирования текста для этого длинного текстового поля, верно? Кроме того, если это ваш реальный вариант использования, его можно легко заменить оператором LIKE, обеспечивающим лучшую производительность и лучшую совместимость.

Erik A 16.05.2024 12:02

Спасибо, это богатое текстовое поле. В шаблоне отладки отображается .*".* для нерабочего шаблона и .*'.* для рабочего шаблона одинарной кавычки. Кстати, утверждение LIKE создает точно такую ​​же проблему. В БД всего около 10 тысяч записей, и производительность регулярных выражений в порядке, и я хотел использовать это, потому что мне нужны и другие регулярные выражения, поэтому мне нужно было более общее решение, как правильно сопоставить " в моей ситуации.

r0berts 16.05.2024 13:44

Чтобы проиллюстрировать ту же проблему без регулярного выражения: WHERE field1 LIKE "*""*" не соответствует и WHERE notes LIKE "*'*" соответствует. Поле1 содержит как одинарные, так и двойные кавычки.

r0berts 16.05.2024 13:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если столбец использует формат Rich Text, то " внутри сохраняется как &quot;.

Любой запрос к этому столбцу будет работать с исходным текстом HTML, а не с форматированным HTML.

Вы можете просмотреть исходный текст, создав форму на основе таблицы с текстовым полем для поля, которое имеет TextBox.TextFormat = Plain Text.


Эрик А. делает очень хорошее замечание в комментарии:

Вы можете использовать функцию PlainText для запроса простого текстового представления форматированного текста.

Затем вы можете использовать это для запроса двойных кавычек:

WHERE PlainText(fld) LIKE "*""*"

или

WHERE PlainText(fld) LIKE '*"*'

Спасибо, это работает как шарм. Поначалу трудно узнать эти детали. Например, сопоставление одинарных кавычек работает, даже если его HTML-объект — &apos;. Таким образом, в полях форматированного текста сохраняется одинарная кавычка ', но вдвойне &quot; полезно знать. Не знаю, почему вопрос был отклонен, но надеюсь, что это может быть полезно для кого-то еще.

r0berts 16.05.2024 15:34

При работе с форматированным текстом в запросах лучше всего использовать функцию PLAINTEXT, чтобы получить представление в виде простого текста вместо поиска по &quot;. Это позволяет избежать запроса, возвращающего строки с кавычками в атрибутах (например, если какой-то текст имеет гиперссылку, содержащую кавычку в URL-адресе). Предполагая, что вы хотите искать реальные цитаты и игнорировать атрибуты.

Erik A 16.05.2024 15:44

Спасибо @ErikA, я совсем забыл об этом.

Andre 16.05.2024 16:06

Другие вопросы по теме