Сравнение движков регулярных выражений - Comparison of regular-expression engines
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
Это сравнение регулярное выражение двигатели.
Библиотеки
| имя | Официальный веб-сайт | Язык программирования | Лицензия на программное обеспечение | Использован |
|---|---|---|---|---|
| Увеличение.Regex[Примечание 1] | Библиотеки Boost C ++ | C ++ | Увеличение | Блокнот ++> = 6.0.0, EmEditor |
| Boost.Xpressive | Библиотеки Boost C ++ | C ++ | Увеличение | |
| CL-PPCRE | Эди Вайц | Common Lisp | BSD | |
| cppre | Джефф Стюарт | C ++ | GPL | |
| DEELX | RegExLab | C ++ | Бесплатное личное и коммерческое использование | |
| FREJ[Заметка 2] | Нечеткие регулярные выражения для Java | Ява | LGPL | |
| GLib / GRegex[Заметка 3] | Справочное руководство по GLib | C | LGPL | |
| ГРЕТА | Microsoft Research | C ++ | ? | |
| Gregex | Grovf Inc. | RTL, HLS | Проприетарный | FPGA ускоряет механизм регулярных выражений> 100 Гбит / с для кибербезопасности, финансов и электронной коммерции. |
| RXP | Титан IC | RTL | Проприетарный | аппаратное ускорение поиска с использованием RegEx, доступное для ASIC, FPGA и облака. Обеспечивает массовую параллельную обработку контента на сверхвысоких скоростях. |
| Гиперсканирование | Intel | C, x86 -специальная сборка (SSSE3 +[1]) | 3-пункт BSD | Rspamd |
| ICU | Международные компоненты для Unicode | C, C ++[Примечание 4] | ICU | Фонд (Версии Apple и Swift с открытым исходным кодом) |
| Джакарта / Regexp | Проект Apache Jakarta | Ява | Apache | |
| java.util.regex | Руководство пользователя Java | Ява | GNU GPLv2 с исключением пути к классам | jEdit |
| JRegex | JRegex | Ява | BSD | |
| MATLAB | Обычные выражения | MATLAB язык | MATLAB, язык технических вычислений | |
| Онигурума | Косако | C | BSD | Атом, Взять командную консоль, Тера Срок, TextMate, Возвышенный текст, SubEthaEdit, EmEditor и jq |
| Онигмо (Oniguruma-мод) | Onigmo | C | BSD | Рубин |
| Паттво | Стивесофт | Java (совместим с Java 1.0) | LGPL | |
| PCRE | pcre.org | C, C ++[Примечание 5] | BSD | HTTP-сервер Apache, Nginx, BBEdit, Юля, HHVM, Блокнот ++ <6.0.0, PHP, Delphi, р |
| Qt / QRegExp | Digia | C ++ | Qt GNU GPL версии 3.0, | Кейт, Kile |
| регулярное выражение - Генри Спенсер библиотеки регулярных выражений | ArgList | C | BSD | |
| RE2 | RE2 | C ++ | BSD | Идти, Google Таблицы, Gmail, G Suite |
| Генри Спенсер Расширенные регулярные выражения | Tcl | C | BSD | |
| RGX | RGX | Библиотека компонентов на основе C ++ | P6R | |
| SubReg | Мэтт Бакнелл | C | Массачусетский технологический институт | |
| TPerlRegEx | Компонент TPerlRegEx VCL | Object Pascal | MPLv1.1 | |
| TRE[Заметка 2] | Вилле Лаурикари | C | BSD | мусл |
| TRegExpr | RegExp Studio | Object Pascal | Двойная лицензия: бесплатное ПО или LGPL с исключением статического связывания | Total Commander |
| XRegExp | XRegExp | JavaScript | Массачусетский технологический институт | |
| Язык Wolfram Language (Mathematica ) | Центр документации языка Wolfram Language | Язык Wolfram Language | Mathematica, то Платформа разработки Wolfram |
Языки
| Язык | Официальный веб-сайт | Лицензия на программное обеспечение | Замечания |
|---|---|---|---|
| ActionScript 3 | Центр технологий ActionScript | Свободный | |
| APL (APLX, Дьялог, GNU) | APL Wiki | Лицензировано соответствующей реализацией | ⎕SS (PCRE), ⎕R/⎕S (PCRE), ⎕SS (PCRE2) соответственно |
| C ++ 11 (C ++ ) | Веб-сайт стандартов C ++ | Лицензировано соответствующей реализацией | Начиная с ISO14822: 2011 (e), аналогично ECMAScript по умолчанию (Грамматическое описание) |
| D | D | Лицензия на программное обеспечение Boost[Примечание 1] | |
| Идти | Golang.org | BSD-стиль | |
| Haskell | Haskell.org | BSD3 | Опускается в языковом отчете и в иерархических библиотеках GHC. |
| Ява | Ява | Стандартная общественная лицензия GNU | RE записываются в виде строк в исходном коде: все обратные косые черты должны быть удвоены, что ухудшает читаемость. |
| JavaScript (ECMAScript ) | ECMA-262 | BSD3 | Ограничено, но RE являются первоклассными гражданами языка с особым /.../mod синтаксис. |
| Юля | JuliaLang.org | Лицензия MIT | RE являются частью базовой библиотеки языка, использующей встроенный PCRE, и доступна дополнительная оболочка для (кода C) ICU. |
| Lua | Lua.org | Лицензия MIT | Использует упрощенный, ограниченный диалект; может быть привязан к более мощной библиотеке, такой как PCRE, или альтернативному парсеру, например LPeg. |
| Mathematica | Вольфрам | Проприетарный | |
| .СЕТЬ | MSDN | Лицензия MIT[Заметка 2][Заметка 3] | |
| Ним | nim-lang.org | Лицензия MIT | Стандартная библиотека включает PCRE на основе повторно и Nre модули, а также различные альтернативы (напр. Strutils, колышки (Анализ грамматики выражений соответствие), strscans, parseutils, так далее.). |
| Free Pascal (Object Pascal ) | www.freepascal.org | LGPL с исключением статической ссылки | Free Pascal 2.6+ поставляется с TRegExpr от Сорокина и двумя другими библиотеками регулярных выражений; Увидеть wiki.lazarus.freepascal.org/Regexpr. |
| OCaml | Caml | LGPL | По состоянию на 2010 г.[Обновить], стандартный модуль обычно считается устаревшим;[2] часто рекомендуемые библиотеки pcre (с полной поддержкой PCRE) и повторно (который не так полон, но требует лучшей производительности и предоставляет интерфейсы для популярных синтаксисов: PCRE, Perl, Posix, Emacs, подстановки оболочки). |
| Perl | Perl.com | Художественная лицензия, или Стандартная общественная лицензия GNU | Полная, центральная часть языка |
| PHP | PHP.net | Лицензия PHP | Имеет две реализации, причем PCRE является более эффективным по скорости, функции |
| POSIX C (C ) | Интернет-публикация POSIX.1 | Лицензировано соответствующей реализацией | Поддерживает POSIX BRE и ERE синтаксис |
| Python | python.org | Лицензия Python Software Foundation | Python имеет две основные реализации: встроенный повторно и регулярное выражение библиотека. |
| Рубин | ruby-doc.org | Стандартная общественная лицензия для библиотеки GNU | Ruby 1.8, Ruby 1.9, Ruby 2.0 и более поздние версии используют разные механизмы; Ruby 1.9 интегрирует Oniguruma, Ruby 2.0 и позже интегрирует Onigmo, форк от Oniguruma. |
| Ржавчина | docs.rs | Лицензия MIT | Крейт основного регулярного выражения не позволяет использовать выражения просмотра. Есть переплет Онигурума, который называется Onig это делает. |
| SAP ABAP | SAP.com | Проприетарный | |
| Tcl | tcl.tk | Лицензия Tcl / Tk (В стиле BSD) | Библиотека Tcl служит также библиотекой регулярных выражений. |
| Язык Wolfram Language | Wolfram Research | Проприетарный: можно бесплатно использовать в ограниченном масштабе на платформе разработки Wolfram. | |
| Схема XML | W3C | Лицензировано соответствующей реализацией | |
| XPath 3 /XQuery | W3C | Лицензировано соответствующей реализацией |
Особенности языка
НОТА: Приложение, использующее библиотеку для поддержки регулярных выражений, не обязательно предлагает полный набор функций библиотеки, например GNU grep, использующий PCRE, не поддерживает опережающий просмотр, хотя PCRE поддерживает.
Часть 1
| "+" квантификатор | Отрицательные классы персонажей | Нежадные кванторы [Примечание 1] | Застенчивые группы [Заметка 2] | Рекурсия | Смотреть вперед | Смотреть за | Обратные ссылки [Заметка 3] | > 9 индексируемых снимков | |
|---|---|---|---|---|---|---|---|---|---|
| Boost.Regex | да | да | да | да | да[Примечание 4] | да | да | да | да |
| Boost.Xpressive | да | да | да | да | да[Примечание 5] | да | да | да | да |
| CL-PPCRE | да | да | да | да | Нет | да | да | да | да |
| EmEditor | да | да | да | да | Нет | да | да | да | Нет |
| FREJ | Нет[Примечание 6] | Нет | Немного[Примечание 6] | да | Нет | Нет | Нет | да | да |
| GLib / GRegex | да | да | да | да | да | да | да | да | да |
| GNU grep | да | да | да | да | Нет | да | да | да | ? |
| Haskell | да | да | да | да | Нет | да | да | да | да |
| RXP | да | да | да | да | Нет | Нет | Нет | да | да |
| ICU Регулярное выражение | да | да | да | да | Нет | да | да | да | да |
| Ява | да | да | да | да | Нет | да | да | да | да |
| JavaScript (ECMAScript ) | да | да | да | да | Нет | да | да[Примечание 7] | да | да |
| JGsoft | да | да | да | да | Нет | да | да | да | да |
| Lua | да | да | Немного[Примечание 8] | Нет | Нет | Нет | Нет | да | Нет |
| .СЕТЬ | да | да | да | да | Нет | да | да | да | да |
| OCaml | да | да | Нет | Нет | Нет | Нет | Нет | да | Нет |
| PCRE | да | да | да | да | да | да | да | да | да |
| Perl | да | да | да | да | да | да | да | да | да |
| PHP | да | да | да | да | да | да | да | да | да |
| Python | да | да | да | да | да[Примечание 9] | да | да | да | да |
| Qt / QRegExp | да | да | да | да | Нет | да | Нет | да | да |
| RE2 | да | да | да | да | Нет | Нет | Нет | Нет | да |
| Рубин / Онигмо | да | да | да | да | да | да | да | да | да |
| TRE | да | да | да | да | Нет | Нет | Нет | да | Нет |
| Vim | да | да | да | да | Нет | да | да | да | Нет |
| RGX | да | да | да | да | Нет | да | да | да | да |
| Tcl | да | да | да | да | Нет | да | да | да | да |
| TRegExpr | да | ? | да | ? | ? | ? | ? | ? | ? |
| Схема XML | да | да | Нет | Нет данных | Нет | Нет | Нет | Нет | Нет данных |
| XPath 3 /XQuery | да | да | да | да | Нет | Нет | Нет | да | да |
| XRegExp | да | да | да | да | Нет | да | Нет | да | да |
- ^ Не жадный квантификаторы соответствуют как можно меньшему количеству символов вместо максимального количества по умолчанию. Обратите внимание, что многие старые, до-POSIX двигатели не были жадными и вообще не имели жадных квантификаторов.
- ^ Застенчивые группы, также называется не захватывающий на группы нельзя ссылаться с помощью обратных ссылок; группы без захвата используются для ускорения сопоставления, когда к содержимому группы не требуется доступ позже.
- ^ Обратные ссылки включить ссылку на ранее сопоставленные группы в более поздних частях регулярного выражения и / или замещающей строки (если применимо). Например, ([ab] +) 1 соответствует «abab», но не «abaab».
- ^ http://www.boost.org/doc/libs/1_47_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html#boost_regex.syntax.perl_syntax.recursive_expressions
- ^ http://www.boost.org/doc/libs/1_47_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.grammars_and_nested_matches.embedding_a_regex_by_reference
- ^ а б FREJ не имеет повторяющихся квантификаторов, но имеет «необязательный» элемент, который ведет себя аналогично простому «?» квантификатор.
- ^ По состоянию на ES2018
- ^ Единственный нежадный квантификатор Lua -
-, который является нежадной версией*. У него нет нежадных версий+или?; в первом случае нежадный эффект может быть достигнут путем повторения токена, за которым следует-, но в последнем случае эквивалента нет. - ^ Поддерживается дополнительным регулярное выражение только библиотека.
Часть 2
| Директивы [Примечание 1] | Условные | Атомные группы [Заметка 2] | Именованный захват [Заметка 3] | Комментарии | Встроенный код | Unicode поддержка собственности [3] | Балансирующие группы [Примечание 4] | Ретроспективы переменной длины [Примечание 5] | |
|---|---|---|---|---|---|---|---|---|---|
| Boost.Regex | да | да | да | да | да | Нет | Немного[Примечание 6] | Нет | Нет |
| Boost.Xpressive | да | Нет | да | да | да | Нет | Нет | Нет | Нет |
| CL-PPCRE | да | да | да | да | да | да | Немного[Примечание 6] | Нет | Нет |
| EmEditor | да | да | ? | ? | да | Нет | ? | Нет | Нет |
| FREJ | Нет | Нет | да | да | да | Нет | ? | Нет | Нет |
| GLib / GRegex | да | да | да | да | да | Нет | Немного[Примечание 6] | Нет | Нет |
| GNU grep | да | да | ? | да | да | Нет | Нет | Нет | Нет |
| Haskell | ? | ? | ? | ? | ? | Нет | Нет | Нет | Нет |
| RXP | да | да | Нет | да | да | Нет | Нет | Нет | Нет |
| ICU Регулярное выражение | да | Нет | да | да[Примечание 7] | да | Нет | да | Нет | Нет |
| Ява | да | Нет | да | да[Примечание 8] | да | Нет | Немного[Примечание 6] | Нет | Нет |
| JavaScript (ECMAScript ) | Нет | Нет | Нет | Нет | Нет | Нет | Немного[Примечание 6][Примечание 9][4] | Нет | Нет |
| JGsoft | да | да | да | да | да | Нет | Немного[Примечание 6] | Нет | да |
| Lua | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
| .СЕТЬ | да | да | да | да | да | Нет | Немного[Примечание 6] | да | да |
| OCaml | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
| PCRE | да | да | да | да | да | да | да | Нет | Нет |
| Perl | да | да | да | да | да | да | да | Нет | Нет[Примечание 10] |
| PHP | да | да | да | да | да | Нет | Нет | Нет | Нет |
| Python | да | да | да[Примечание 11] | да | да | Нет | да[Примечание 12] | Нет | да[Примечание 11] |
| Qt / QRegExp | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
| RE2 | да | Нет | ? | да | Нет | Нет | Немного[Примечание 6] | Нет | Нет |
| Рубин / Онигмо | да | да | да | да | да | да | Немного[Примечание 6] | Нет | Нет |
| Tcl | да | Нет | да | Нет | да | Нет | да | Нет | Нет |
| TRE | да | Нет | Нет | Нет | да | Нет | ? | Нет | Нет |
| Vim | да | Нет | да | Нет | Нет | Нет | Нет | Нет | да |
| RGX | да | да | да | да | да | Нет | да | Нет | Нет |
| Схема XML | Нет | Нет | Нет | Нет | Нет | Нет | да | Нет | Нет |
| XPath 3 /XQuery | Нет | Нет | Нет | Нет | Нет | Нет | да | Нет | Нет |
| XRegExp | Только ведущий | Нет | Нет | да | да | Нет | да | Нет | Нет |
- ^ Также известен как модификаторы флагов, модификаторы режимов или варианты букв. Пример шаблона: «(? I: test)».
- ^ Также называется независимые подвыражения.
- ^ Подобно обратным ссылкам, но с именами вместо индексов.
- ^ Специальная функция, позволяющая сопоставлять сбалансированные конструкции без рекурсии.
- ^ Относится к возможности включения кванторов в ретроспективы, что делает их длину непредсказуемой.
- ^ а б c d е ж г час я Поддержка свойств Unicode может быть неполной (продукты постоянно обновляются!). Все будет неполным при выпуске новой версии Unicode до тех пор они обновлены, чтобы соответствовать.
- ^ Доступно с ICU55.
- ^ Доступно с JDK7.
- ^ Поддержка и набор свойств зависят от реализации.
- ^ Экспериментальная поддержка добавлена в v5.29.9.
- ^ а б Поддерживается дополнительным регулярное выражение только библиотека.
- ^ Может быть доступен только в библиотеке регулярных выражений при использовании с версиями Python после 3.3.
Возможности API
| Родной UTF-16 поддержка[Примечание 1] | Родной UTF-8 поддержка[Примечание 1] | Многострочное соответствие | Частичное совпадение[Заметка 2] | |
|---|---|---|---|---|
| Boost.Regex | Нет | Нет | да | да |
| GLib / GRegex | да | да | да | да |
| RXP | да | да | Нет | да |
| ICU Регулярное выражение | да | Нет | да | ? |
| Ява | Нет | Частичное[Заметка 3] | да | да |
| .СЕТЬ | Нет[Примечание 4] | да | да | ? |
| PCRE | да[Примечание 5] | да | да | да |
| Qt / QRegExp | да | Нет | Нет | ? |
| Tcl | да | да[Примечание 6] | да | ? |
| TRE | да | да | да | ? |
| RGX | Нет | Нет | да | ? |
| wxWdigets::wxRegEx[Примечание 7] | да | да | да | ? |
| XRegExp | да | ? | да | ? |
- ^ а б Означает, что формат можно использовать внутри компании без явного преобразования.
- ^ Частичное совпадение всего регулярного выражения. Например, шаблон «. * END $» будет частично соответствовать любой строке, но только строкам, полностью оканчивающимся на END.[1].
- ^ Поддерживает стандарт Unicode 4.0 с 2003 года; последние планы для JDK7 включают поддержку Unicode 6.0 (2011).[2].
- ^ Реализация использует оригинальные UCS-2 support / features, поэтому он распознает всего 64K символов (vs UTF-16 1,112,064 символа). Представитель разработчика Microsoft ответил на отчет об этой ошибке, как «не исправит» в 2010 году.[3].
- ^ Начиная с версии 8.30.
- ^ Tcl включает средства для преобразования в UTF-8 и обратно.
- ^ wxRegEx использует любую предоставленную систему POSIX библиотека или, если она недоступна, и для режима Unicode использует Генри Спенсер библиотека.
Смотрите также
использованная литература
- ^ https://intel.github.io/hyperscan/dev-reference/getting_started.html#requirements
- ^ [4]
- ^ https://www.unicode.org/reports/tr18/
- ^ "ECMA-262, 9-е издание, июнь 2018 г. Спецификация языка ECMAScript® 2018". www.ecma-international.org. Получено 4 августа 2020.
внешние ссылки
- Сравнение вкусов регулярных выражений - Подробное сравнение самых популярных разновидностей регулярных выражений
- Сводка синтаксиса регулярного выражения
- Онлайн-тестирование регулярных выражений - с поддержкой Java, JavaScript, .Net, PHP, Python и Ruby
- Реализация регулярных выражений - цикл статей Расса Кокса, автора RE2
- Механизмы регулярных выражений