Как я могу использовать одно и то же регулярное выражение в разных языках программирования? - PullRequest
16 голосов
/ 21 декабря 2011

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 21 декабря 2011

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

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


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


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

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

.. или вы можете скомпилировать список / таблицу вашеговладеть.

1 голос
/ 21 декабря 2011

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

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

0 голосов
/ 14 июля 2012

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

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

...