Как я могу использовать одно и то же регулярное выражение на разных языках программирования? - программирование
Подтвердить что ты не робот

Как я могу использовать одно и то же регулярное выражение на разных языках программирования?

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

У меня есть довольно большой проект, который включает JavaScript, Ruby и Java, и все они должны касаться одних и тех же регулярных выражений. Мы выбрали Java как наш "официальный" интерпретатор RE, а это означает, что в любой момент, когда другие два языка должны оценивать RE, они должны каким-то образом передать его в Java-программу, и это начинает увеличивать количество накладных расходов.

Если бы я мог выбрать любой диалект RE и вызывать, что, по крайней мере, изначально на всех языках, это было бы огромным шагом вперед для нас. Это возможно? Это уже сделано? Мы посмотрели на PCRE, и технически можно вызвать его через собственные привязки с Java и Ruby (хотя он оставляет JS на холоде), но я не нашел, что кто-то на самом деле это делает. Мы одни?

ETA: морщина, о которой я не упоминал, заключается в том, что эта система применяет регулярное выражение, предоставленное пользователем. (Да, я понимаю, что это проблема безопасности и т.д., Но это для внутреннего использования доверенными, приписываемыми пользователями.) Я, безусловно, могу предложить список "не делайте этого" , чтобы избежать, но я надеюсь, что это не лучшее решение.

4b9b3361

Ответ 1

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

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


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


Поскольку у python и java есть модули, доступные для выполнения собственного javascript, вы можете сказать, что все выражения должны быть написаны для javascript, а затем заставлять будущих разработчиков использовать доступный им модуль, чтобы убедиться, что регулярное выражение всегда будет работать точно Таким же образом.

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

.. или вы можете омпанить собственный список/таблицу.

Ответ 2

Диалекты все немного разные, но они перекрываются почти во всех основных точках. (Основные различия заключаются не в самих регулярных выражениях, а в том, как вы их называете (один язык find - это еще один matches и т.д.) И в поддержку литералов регулярных выражений (один язык // - это еще одна необработанная строка это еще одна строка обратных косых черт).)

Вместо того, чтобы каким-то образом получить JavaScript для поддержки особенностей Java и наоборот, я думаю, что, вероятно, лучше ограничить себя огромным подмножеством регулярных выражений, которые являются общими для всех трех ваших языков, и использовать модульные тесты для обеспечения того, чтобы ваши regexes ведут себя одинаково во всех трех.

Ответ 3

Один (тяжеловесный) вариант должен был бы создать "перекрестный компилятор regexp", который мог бы принять в качестве входного выражения регулярное выражение, записанное в некоторой канонической форме (например, как регулярное выражение Perl), затем сканирует и анализирует его на синтаксическое дерево и выводимые эквивалентные регулярные выражения для других языков (например, Python или Java). Это позволит вам написать регулярное выражение один раз и заставить его работать повсюду, поскольку компилятор выполнит всю работу по преобразованию между форматами.

Надеюсь, это поможет!