Функции, общие для всех вариантов регулярных выражений?
-
09-06-2019 - |
Вопрос
Я видел много общего в возможностях регулярных выражений различных инструментов/языков с поддержкой регулярных выражений (например,perl, sed, java, vim и т. д.), но у меня также есть много различий.
Есть ли стандартный подмножество возможностей регулярных выражений, которые будут поддерживать все инструменты/языки с поддержкой регулярных выражений?Как возможности регулярных выражений различаются в зависимости от инструмента/языка?
Решение
Сравните варианты регулярных выражений
Другие советы
Большинство инструментов/языков регулярных выражений поддерживают их. базовые возможности:
- Классы/наборы символов и их отрицание - []
- Якоря - ^$
- Чередование - |
- Кванторы - ?+*{n,m}
- Метасимволы - \w, \s, \d, ...
- Обратные ссылки - \1, \2, ...
- Точка - .
- Простые модификаторы, такие как /g и /i, для глобального и игнорируемого регистра.
- Экранирующие символы
Поддержка более продвинутых инструментов/языков:
- Просмотр вперед и назад
- Классы символов POSIX
- Границы слов
- Встроенные переключатели, например, разрешают нечувствительность к регистру только для небольшой части регулярного выражения.
- Модификаторы, такие как /x, чтобы разрешить дополнительное форматирование и комментарии, /m для многострочного ввода.
- Именованные захваты
- Юникод
Если вы взяли грамматику регулярных выражений grep, а не egrep или грамматику регулярных выражений sed, и использовали ее, вам следует использовать безопасное подмножество на многих платформах и инструментах.
Единственное, что может вас укусить, это когда вы переключаетесь между реализациями регулярных выражений с использованием конечных автоматов (FSA) и реализациями с обратным отслеживанием, напримерРеализации кванторов будут варьироваться от grep до Perl.
Реализации на основе FSA найдут самое длинное совпадение, начиная с первой возможной позиции.При обратном поиске будет найдено первое совпадение с левым смещением, начиная с первой возможной позиции.То есть он будет пробовать каждую ветвь в порядке в шаблоне, пока не будет найдено совпадение.
Рассмотрим строку "xyxyxyzz"
, и шаблон "(xy)*(xyz)?"
.Механизмы на основе FSA будут соответствовать максимально длинной подстроке, "xyxyxyz"
.Механизмы, основанные на обратном отслеживании, будут соответствовать первой подстроке, смещенной влево, "xyxyxy"
.
Стандартного двигателя нет.Однако формат расширенных регулярных выражений POSIX является допустимым подмножеством большинства механизмов и, вероятно, максимально близок к стандартизированному подмножеству.
См. синтаксис регулярных выражений emacs: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html#Regexps.
Я помню, что читал, что синтаксис emacs высечен в камне (из соображений обратной совместимости), поэтому, если вы хотите быть совместимым с все, сделайте все совместимым с этим.Некоторые инструменты могут поддерживать это, другие — нет.
Хотя у вас есть достойная цель, я думаю, что ее будет чрезвычайно трудно достичь, и я также обнаружил, что с регулярными выражениями emacs сложно работать.Может быть, 99% всего достаточно хорошо, если это делает вас счастливее и продуктивнее?