stringtranslate.com

Соответствие подстановочных знаков

В информатике алгоритм сопоставления подстановочных знаков (также известный как подстановка ) полезен при сравнении текстовых строк, которые могут содержать синтаксис подстановочных знаков . [1] Обычно эти алгоритмы используются в интерфейсах командной строки , например, в оболочке Bourne [2] или командной строке Microsoft Windows [3] или текстовом редакторе или файловом менеджере, а также в интерфейсах некоторых поисковых систем [4] и баз данных. [5] Сопоставление подстановочных знаков является подмножеством проблемы сопоставления регулярных выражений и сопоставления строк в целом. [6]

Проблема

Подстановочный шаблон проверяет подстановочный шаблон p на входной строке s . Он выполняет якорное сопоставление, возвращает true только тогда, когда p соответствует всему s .

Шаблон может быть основан на любом общем синтаксисе (см. подстановку ), но программисты Windows склонны обсуждать только упрощенный синтаксис, поддерживаемый собственной средой выполнения C: [7] [8]

В данной статье в основном обсуждается формулировка проблемы для Windows, если не указано иное.

Определение

Задачу сопоставления с помощью индексов, начинающихся с нуля, можно рекурсивно определить следующим образом:

где m ij — результат сопоставления шаблона p с текстом t, усеченным на i и j символах соответственно. Это формулировка, используемая алгоритмом Рихтера и алгоритмом Snippets , найденным в коллекции Кантатора. [9] [10] Это описание похоже на расстояние Левенштейна .

Связанные проблемы

К непосредственно связанным проблемам в информатике относятся:

История

Ранние алгоритмы для сопоставления подстановочных знаков часто полагались на рекурсию , но эта техника подвергалась критике по соображениям производительности [10] и надежности [8] . Нерекурсивные алгоритмы для сопоставления подстановочных знаков получили признание в свете этих соображений.

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

Рекурсивные алгоритмы

Рекурсия обычно происходит при сопоставлении, *когда есть еще суффиксы для сопоставления. Это форма обратного отслеживания , также выполняемая некоторыми сопоставителями регулярных выражений.

Общая форма этих алгоритмов одинакова. При рекурсии алгоритм разбивает входные данные на подстроки и считает совпадение произошедшим, когда ОДНА из подстрок возвращает положительное совпадение. Для dowild("*X", "abcX")он жадно вызывает dowild("X", "abcX"), dowild("X", "bcX")и . Обычно они отличаются менее важными вещами dowild("X", "cX"), dowild("X", "X")такими как поддержка функций, и более важными факторами, такими как незначительные, но очень эффективные оптимизации. Вот некоторые из них:

Алгоритм Мартина Рихтера является исключением из этого шаблона, хотя общая операция эквивалентна. На * он рекурсивно увеличивает любой из индексов, следуя формулировке задачи динамического программирования. Метод "ABORT" также применим к нему. [9] На типичных шаблонах (как протестировал Кантаторе) он медленнее, чем реализации жадного вызова. [10]

Рекурсивные алгоритмы в целом проще для рассуждений, и с модификацией ABORT они работают приемлемо с точки зрения сложности в худшем случае. На строках без * они тратят линейное время на размер строки для сопоставления, поскольку существует фиксированное отношение один к одному.

Нерекурсивные алгоритмы

Критики рекурсивных алгоритмов разработали следующее:

Следующее не является:

Итеративные функции выше реализуют возврат, сохраняя старый набор указателей шаблона/текста и возвращаясь к нему в случае неудачного сопоставления. По словам Курта, поскольку требуется только одно успешное сопоставление, необходимо сохранить только один такой набор. [17]

Кроме того, проблема сопоставления с подстановочными знаками может быть преобразована в сопоставление с регулярными выражениями с использованием наивного подхода замены текста . Хотя нерекурсивные сопоставления с регулярными выражениями, такие как конструкция Томпсона, на практике используются реже из-за отсутствия поддержки обратных ссылок, сопоставление с подстановочными знаками в целом не обладает столь же богатым набором функций. (На самом деле, многие из приведенных выше алгоритмов поддерживают только ?и *.) Реализация Расса Кокса NFA Томпсона может быть тривиально модифицирована для этого. [26] Алгоритм nrgrep на основе BDM Густаво Наварро обеспечивает более оптимизированную реализацию с упором на эффективные суффиксы. [27] См. также регулярные выражения § Реализации .

Смотрите также

Ссылки

  1. ^ "Подстановочные знаки". ScienceDirect . 2018.
  2. ^ Куигли, Элли (2005). Краткое руководство по программированию оболочки UNIX. InformIT.com.
  3. ^ "MS-DOS и подстановочные знаки Windows". Библиотека Microsoft Developer Network . 31 мая 2018 г.
  4. ^ "Apache Lucene - Синтаксис парсера запросов". Документация Apache Lucene 2.9.4. 2006.
  5. ^ "SQL Wildcards". W3Schools . 2018.
  6. ^ Гойвартс, Ян (2018). «Добро пожаловать на Regular-Expressions.info». RegularExpressions.info.
  7. ^ «Wildcard Expansion». docs.microsoft.com . 8 февраля 2022 г.
  8. ^ abc Krauss, Kirk (2008). «Сопоставление подстановочных знаков: алгоритм». Журнал доктора Добба .
  9. ^ abc Deadlock (2015). "Рекурсивный алгоритм сопоставления подстановочных знаков C++". Stack Overflow .
  10. ^ abcd Кантаторе, Алессандро (2003). «Алгоритмы сопоставления с подстановочными знаками».
  11. ^ Iliopoulos, Costas S.; Rahman, M. Sohel (2007). «Pattern Matching Algorithms with Don't Cares» (PDF) . SOFSEM 2007: Теория и практика компьютерных наук, 33-я конференция по современным тенденциям в теории и практике компьютерных наук . Гаррахов, Чешская Республика. S2CID  14538871. Архивировано из оригинала (PDF) 2019-12-17.
  12. ^ Клиффорд, Питер; Клиффорд, Рафаэль (январь 2007 г.). «Простое детерминированное сопоставление подстановочных знаков». Information Processing Letters . 101 (2): 53–54. doi :10.1016/j.ipl.2006.08.002.
  13. ^ Wu, Xindong; Qiang, Ji-Peng; Xie, Fei (12 сентября 2014 г.). «Соответствие шаблону с гибкими подстановочными знаками». Журнал компьютерной науки и технологий . 29 (5): 740–750. doi :10.1007/s11390-014-1464-3. S2CID  16824910.
  14. ^ аб Зальц, Рич (1991). "wildmat.c". Гитхаб .
  15. ^ Filip (2014). «Сравнение строк с подстановочным знаком». Stack Overflow .
  16. ^ Муругесан, Вигнеш (2014). «Алгоритм сопоставления WildCard».
  17. ^ abc Курт, Доган. «Методы сопоставления с подстановочными знаками».
  18. ^ ван Россум, Гвидо (20 ноября 2019 г.). "freebsd/lib/libc/gen/fnmatch.c". GitHub . Получено 21 ноября 2019 г. .
  19. ^ "fnmatch.c". opensource.apple.com. 1999.
  20. ^ "fnmatch_internal.c". Зеркала Берена Минора. 21 ноября 2019 г.
  21. ^ ab "git/git: wildmatch.c". GitHub . 2020-01-20.
  22. ^ ab "uwildmat.c in trunk/lib – INN". inn.eyrie.org . Получено 27 ноября 2019 г. .
  23. ^ Краусс, Кирк (2018). «Соответствие подстановочных знаков: улучшенный алгоритм для больших данных». Разработка для производительности.
  24. ^ Siler (2013). «Рекурсивные решения для сопоставления шаблонов glob». Stack Overflow .
  25. ^ Handy, Jack (2005). "Сравнение строк с подстановочными знаками (глоббинг)". Code Project .
  26. ^ Кокс, Росс. «Соответствие регулярным выражениям может быть простым и быстрым».
  27. ^ Наварро, Гонсало (10 ноября 2001 г.). «NR-grep: быстрый и гибкий инструмент сопоставления с образцом» (PDF) . Программное обеспечение: практика и опыт . 31 (13): 1265–1312. doi :10.1002/spe.411. S2CID  3175806.