Этот проект ищет сопровождающих. Для начала, есть несколько запросов на притяжение, ожидающие рассмотрения.
Дайте мне знать по адресу [email protected], если вы хотите подняться!
TRE - это легкая, надежная и эффективная библиотека SOPIX, соответствующую SOPIX, с некоторыми захватывающими функциями, такими как приблизительное (нечеткое) сопоставление.
Соответствующий алгоритм, используемый в TRE, использует линейное время наихудшего часа в длине поискового текста, и квадратичное время наихудшего часа в длине использованного регулярного выражения.
Другими словами, временная сложность алгоритма - O (M^2n), где m - длина регулярного выражения, а n - длина текста. Используемое пространство также является квадратичным по длине регуляции, но не зависит от поисковой строки. Это квадратичное поведение происходит только в патологических случаях, которые, вероятно, очень редки на практике.
Вот как работать с этим кодом.
Вам понадобятся следующие инструменты, установленные в вашей системе:
Во -первых, приготовьте дерево. Изменить корень исходного каталога и запустить
./utils/autogen.sh
Это будет регенерировать различные вещи, используя необходимые инструменты, так что вы получите созданное дерево.
После этого вы можете запустить сценарий настройки и построить Tre, как обычно:
./configure
make
make check
make install
В подготовленном дереве эта команда создает тарбол исходного кода:
./configure && make dist
В качестве альтернативы вы можете бежать
./utils/build-sources.sh
который строит пакеты исходного кода и помещает их в подкаталог dist
. Этот скрипт нуждается в рабочей команде zip
.
Тре - это не просто еще один маттер с использованием корпорации. У Tre есть некоторые функции, которых нет в большинстве бесплатных реализаций POSIX. Большинство из этих функций также не присутствуют в не свободных реализациях, в этом отношении.
Приблизительное сопоставление шаблонов позволяет приблизительно совпадения, то есть позволяет совпадениям быть близкими к поисковому шаблону при некоторой степени близости. Tre использует меру редактирования (также известную как расстояние Levenshtein), где символы могут быть вставлены, удалены или заменены в поисковый текст, чтобы получить точное соответствие.
Каждая вставка, удаление или замена добавляет расстояние или стоимость матча. TRE может сообщить о совпадениях, которые имеют стоимость ниже, чем некоторые пороговые значения. TRE также можно использовать для поиска матчей с самой низкой стоимостью.
TRE включает в себя версию инструмента командной строки Congenp (приблизительный GREP) для приблизительного сопоставления Regexp в стиле GREP. В отличие от других согласных реализаций (например, Sun Wu и Udi Manber из Университета Аризоны) TRE договоренности позволяет полной режиме по обеспечению любой длины, любое количество ошибок и неравномерные затраты на вставку, делецию и замену.
POSIX определяет поведение функций REGEXP точно. Тре пытается соответствовать этим спецификациям как можно более строго. Тре всегда возвращает правильные совпадения для подчиненных, например. Очень немногие другие реализации делают это правильно. На самом деле, единственные другие реализации, помимо Тре, о которых я знаю (бесплатно или нет), которые понимают это правильно, - это тому Лорду, Режекс ++ от Джона Мэддока, а также режима At & T AST Гленна Фаулера и Дуга Макилроя.
Стандартным TRE пытается соответствовать IEEE STD 1003.1-2001, или Open Group Base Secitifations Выпуск 6, обычно называемая «POSIX». Соответствующие части являются базовыми спецификациями на регулярных выражениях (и обосновании) и описании API regcomp()
.
Отличный опрос по Posix Regexp Matchers, см. Страницы TestRegex Гленна Фаулера из AT & T Labs Research.
Из -за алгоритма соответствия, используемого в TRE, максимальное время, потребляемое любым вызовом regexec()
всегда прямо пропорционально длине поисковой строки. Существует одно исключение: если используются обратные ссылки, соответствие может занять время, которое растет в геометрической прогрессии с длиной строки. Это связано с тем, что соответствующие обратные ссылки являются полной проблемой NP, и почти наверняка требует экспоненциального времени для совпадения в худшем случае.
Вызов regexec()
никогда не выделяет память из кучи. TRE выделяет всю память, которая ему нужна во время вызова regcomp()
, и некоторое временное рабочее пространство из кадра стека для продолжительности вызова regexec()
. Количество необходимого временного пространства является постоянным во время сопоставления и не зависит от поисковой строки. Для режима разумного размера TRE требуется менее 50 тыс. Динамически распределенной памяти во время вызова regcomp()
, менее 20 тыс. Для скомпилированного буфера рисунка и менее двух килобайт временного рабочего пространства из кадра стека во время вызова regexec()
. Там нет времени / компромисса памяти. Tre также невелик по размеру кода; Статически связывание с TRE увеличивает исполняемый размер менее 30 тыс. (GCC-3.2, x86, GNU/Linux).
Tre поддерживает многобитные наборы символов. Это позволяет беспрепятственно использовать Regexps, например, с японскими местами. Тре также предоставляет широкий характер API.
TRE предоставляет API, которые позволяют бинарно нулевые символы как в REGEXPS, так и в поисках строк. Стандартный API не может быть легко использован для поиска печатных слов из двоичных данных (хотя это возможно с некоторым взломом). Поиск шаблонов, которые содержат бинарные нули, встроенные вообще невозможно со стандартным API.
Тре абсолютно безопасно. Все экспортируемые функции повторно въезжают, а один скомпилированный объект REGEXP может использоваться одновременно в нескольких контекстах; например, в main()
и обработчике сигнала, или во многих потоках многопоточного приложения.
Тре портативна на нескольких платформах. Ниже приведена таблица платформ и компиляторов, используемых для разработки и тестирования TRE:
Платформа | Компилятор |
---|---|
FreeBSD 14.1 | Clang 18 |
Ubuntu 22.04 | GCC 11 |
MacOS 14.6 | Clang 14 |
Windows 11 | Microsoft Visual Studio 2022 |
TRE должен компилировать без изменений на большинстве современных платформ POSIX и быть легко переносимым на любую платформу с размещенной реализацией C.
В зависимости от платформы, вам может потребоваться установить LIBUTF8, чтобы получить широкую поддержку символов и мультибитов.
TRE выпускается по лицензии, которая по сути такая же, как и лицензия в стиле BSD «2», используемая в NetBSD. Смотрите лицензию на файл для деталей.
В настоящее время существует две функции, оба связанные с сопоставлением элементов, отсутствующие в 100% соответствии Posix. Это:
Поддержка сопоставления элементов (например [[.<X>.]]
, Где <X>
является элементом сопоставления). Невозможно переносительно поддерживать элементы сбора сочетания, поскольку POSIX не определяет способ определения того, является ли последовательность символов мульти-символом, собранным элементом или нет.
Поддержка классов эквивалентности, например [[=<X>=]]
, где <X>
является элементом сопоставления. Класс эквивалентности соответствует любому символу, который имеет тот же основной вес сбора, что и <X>
. Опять же, POSIX не обеспечивает портативного механизма для определения основного веса сопоставления элемента сбора.
Обратите внимание, что другие портативные реализации Regexp также не поддерживают совокупные элементы. Единственным исключением является REGEX ++, которая поставляется с собственной базой данных для сбора элементов для разных локалов. Поддержка для сопоставления элементов и классов эквивалентности не была широко запрошена и в настоящее время не очень высока в списке TODO.
Это другие функции, которые я планирую вскоре реализовать очень скоро:
Все недостающие расширения GNU включены в gnu -regex, например [[:<:]]
и [[:>:]]
.
Флаг REG_SHORTEST
regexec()
для возврата самого короткого матча вместо самого длинного матча.
Perl-совместимый синтаксис:
[:^class:]
соответствует всем, кроме персонажей в классе. Обратите внимание, что [^[:class:]]
уже работает, это было бы просто удобным сокращением.
A
Совпадение только в начале строки.
Z
совпадают только в конце строки, или перед Newline в конце.
z
совпадают только в конце строки.
l
Низье следующий Чар (подумайте VI).
u
Верхишное заглавное лицо (подумайте VI).
L
Без регистра до E
(подумайте VI).
U
Верхишон до E
(подумайте VI).
(?=pattern)
Положительный взгляд с нулевой шириной.
(?!pattern)
(?<=pattern)
Положительный взгляд с нулевой шириной.
(?<!pattern)
Негативные утверждения с нулевой шириной.
Документация, особенно для нестандартных функций TRE, таких как приблизительное сопоставление, находится в процессе работы (с слабо определенным «прогресс» ...), если вы хотите найти расширение для использования, чтение The include/tre/tre.h
заголовок. Может дать некоторые дополнительные подсказки, если вам удобно с исходным кодом C.