Я хотел бы реализовать простую форму поиска для пользователей по списку строк. Предположим, что пользователи знакомы с подстановочными знаками в целом, но не с регулярными выражениями.
Это, конечно, тривиально сделать с помощью TMask:
uses
masks;
procedure search(mystring: string);
var
M: TMask;
begin
M:= Tmask.create(mystring);
try
// some action if matches
// loop code skipped here
if M.Matches(Myform.content) then
Myform.found := true;
finally
M.Free;
end;
end;
Это работает так, как ожидалось.
Но как мне выполнить поиск строк, содержащих литеральные символы *
и ?
? Скажем, я хочу найти строку ***
или *****
? Шаблон поиска ***??
будет соответствовать чему угодно, как и одиночный *
, поэтому он также найдет ABCDEF
.
Лучше ли сделать самостоятельное решение на основе регулярных выражений в фоновом режиме или существует альтернативная простая библиотека подстановочных знаков?
У меня была бы такая радиогруппа:
(и, возможно, флажок «С учетом регистра» и/или «Поиск слов»)
а затем либо вызовите M.Matches
, либо POS(MyString,MyForm.Content)>0
(с .ToUpper
или без него)
на основе выбора.
Вы должны позволить пользователю решить, являются ли эти символы буквальными или специальными — вы не можете сделать это самостоятельно.
@AndreasRejbrand: Это тоже вариант — радиогруппа мне нравится больше, потому что она более информативна. ЮММВ.
Я не подумал о совершенно очевидном решении «pos()». Это будет первоначальный способ. Следующим улучшением может стать создание подклассов масок, чтобы можно было выбирать символы маски.
Лично я бы поставил три флажка («С учетом регистра», «Поиск по словам» и «Использовать подстановочные знаки (* и ?)»).