дифференциация и тестирование вариантов регулярных выражений

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

Большинство из этих различий включают семантику, связанную с тем, экранирован ли символ или нет. Чаще всего это проблема с круглыми скобками, но может относиться к фигурным скобкам и другим. Вероятно, это следствие синтаксиса языка или среды, в которой находится реализация. Например, если символ $ указывает на имя переменной на каком-то языке, можно ожидать, что регулярные выражения, представленные на этом языке, потребуют перехода от привязки «конец строки» к \$ или чему-то подобному. Но что сбивает с толку в этот момент, так это то, как вы представляете реальный знак доллара. Я считаю, что Perl обходит это, заключая регулярное выражение в косую черту /.

Точно так же существуют escape-последовательности для самих определенных символов, например, непечатаемых символов, таких как \n и \t. Кроме того, есть похожие общие группы символов, такие как \d для цифр, \s для пробелов и \w, которые, как я только что узнал, охватывают символы подчеркивания, а также цифры. Несколько раз я пытался использовать \a для «алфавитной» группы, но в итоге это соответствовало только символу колокольчика 0x07.

Совершенно очевидно, что не существует простого и одноразового решения, позволяющего узнать все различия в функциях и синтаксисе, предлагаемых бесчисленным множеством реализаций регулярных выражений, за исключением того, что кто-то выполняет всю тяжелую работу и представляет результаты в хорошо организованном виде. стол. Вот один пример именно этого, но, конечно, он не не покрываю несколько программ, которые я сам активно использую, в том числе vim, sed, Notepad++, Eclipse и, верьте этому или нет, MS Word (по крайней мере, версия 2010, я подозреваю, что 2007 также имеет это, они называют это «подстановочными знаками») также имеет простую реализацию регулярного выражения.

Я предполагаю, что я хочу быть настолько ленивым, насколько это возможно (в определенном смысле), пытаясь придумать способ определить для любой данной реализации регулярного выражения, какие его «настройки экранирования» вне всяких сомнений, применяя один (или несколько ) запросы.

Я думаю, что могу создать файл, который содержит тестовые примеры вместе с огромным запросом регулярного выражения, и каким-то образом спроектировать его так, чтобы его однократный запуск показал мне, какой именно синтаксис мне нужно использовать впоследствии, не сомневаясь в себе больше. (в отличие от необходимости редактировать файлы и использовать несколько запросов, чтобы выяснить одно и то же, что через некоторое время ужасно устаревает).

Если никто другой не пытался построить такое чудовище, я могу взяться за эту задачу сам. Если это вообще возможно. Это возможно?

Я попытался привести пример (это было просто для того, чтобы выяснить, является ли якорь EOL $ или \$), но в каждом случае мне приходилось использовать множество различных запросов поиска/замены, чтобы определить, как программа будет реагировать на Вход.

Редактировать: я придумал кое-что, используя захват и возврат. Я должен поработать над этим еще немного.

Обновление: Notepad++ не реализует оператор ИЛИ, обычно обозначаемый каналом |. «Подстановочные знаки» Word также являются плохой заменой, в нем нет | или *. Я почти уверен, что отсутствие любого из операторов регулярных выражений (union, concat, star) означает, что он не может генерировать обычную грамматику, поэтому эти два исключаются.

Я могу создать входной файл следующим образом:

$
*
]
EOL

и запрос

(\$)|(\*)|(\[)|($)

замена на

escDollar:\1:escStar:\2:escSQBrL:\3:Dollar:\4:

дает результат (при условии, что неэкранированные скобки являются группой, а неэкранированная труба - или)

escDollar:$:escStar::escSQBrL::Dollar::
escDollar::escStar:*:escSQBrL::Dollar::
]escDollar::escStar::escSQBrL::Dollar::
EOLescDollar::escStar::escSQBrL::Dollar::

Я запускал это в vim. Этот вывод будет демонстрировать отдельные символы, которые соответствуют каждому элементу, указанному рядом с ним, т. е. экранированный элемент со знаком доллара соответствует фактическому символу знака доллара, а не неэкранированному элементу со знаком доллара в конце.

Трудно понять, что происходит с якорем $, так как он соответствует нулю символов, но найти для него решение не составит труда. Кроме того, это не обычно ошибочно. Меня особенно беспокоят круглые скобки и скобки, а также разные скобки. Когда у вас есть 4 разных типа, вы можете использовать 2 ^ 4 комбинации экранированных и неэкранированных версий. Метод проб и ошибок ужасен.

Этот вывод не слишком сложно проанализировать с первого взгляда, а также очень легко обработать как часть скрипта. Одна вопиющая проблема, которая остается, заключается в том, чтобы выяснить, нужно ли экранировать скобки и вертикальную черту. Потому что от них зависит функциональность всего этого.

Казалось бы, для этого потребуется несколько запросов. Возможно, с помощью искусно спроектированного набора обратных косых черт, скобок и конвейеров можно вычислить комбинацию (в конце концов, только 4 возможности) с первоначальным запросом, а затем выбрать последующий запрос генератора матриц на его основе.

Что-то вроде этого показывает, что это может работать:

(e)
(f)

запрос

\((f\))|\|\((e\))

заменить

\1:\2

будет производить:

  • :(e, если экранированные круглые скобки являются группой, а экранированная вертикальная черта - или
  • :e), если скобки — это группа, а выходная труба — это или
  • (f:, если экранированные скобки — это группа, а труба — это или
  • f):, если скобки - группа, а труба - или

Мне все еще не очень нравится это, потому что для этого требуется второй запрос на втором наборе входных данных. Слишком много настроек. Я могу просто сделать 4 копии "матрицы".


person Steven Lu    schedule 07.09.2011    source источник
comment
Возможный дубликат stackoverflow.com/questions/23216/   -  person Mansoor Siddiqui    schedule 08.09.2011
comment
Я бы использовал для этого документацию, а не тестирование, а затем подкрепил бы это тестированием в качестве продолжения.   -  person Justin Morgan    schedule 08.09.2011
comment
Да, я бы тоже так сделал, но мне нужна крутая штука, которая позволит компьютеру делать всю работу за меня.   -  person Steven Lu    schedule 08.09.2011


Ответы (1)


В таблице на этой странице довольно хорошо показано, какие функции доступны в каких реализациях регулярных выражений:

http://www.regular-expressions.info/refflavors.html

person Mansoor Siddiqui    schedule 07.09.2011
comment
Вау, я был на этом сайте, но не заметил эту удивительную диаграмму! Спасибо! Я надеюсь, что кто-то может прокомментировать мою идею попытаться придумать исчерпывающий запрос для решения этой проблемы в общем случае. - person Steven Lu; 08.09.2011
comment
Я поднял вопрос на math.SE, связанный с этим. math.stackexchange.com/questions/62769/ - person Steven Lu; 11.09.2011