2011-12-21 1 views
16

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

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

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

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

+1

А, пользовательские регулярные выражения. Я знал, что у нас что-то не хватает;) – BoltClock

+0

(Я просто хотел опубликовать стоп-лосс, который мы использовали, на всякий случай, но я все равно люблю слышать что-то лучшее.) Мы выбрали Java regex. Мы можем запустить их из Ruby-кода, если Ruby запущен в JRuby. Для наших целей это достаточно хорошо. Мы также написали сервлет Java, который в основном запускает регулярное выражение против тестовых данных, в качестве службы RESTful. Это позаботится о конце JavaScript, хотя, конечно, это не очень хорошо: -/ – Coderer

ответ

11

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

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


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


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

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

..или вы могли бы опустить список/таблицу.

+2

+1 для этой фантастической ссылки! –

+0

Супер удивительная ссылка, но я замечаю, что на самом деле есть некоторые * не * расширенные функции, которые, вероятно, будут иметь значение. Первое, что выпрыгивает на меня, - это «Hyphen in [\ dz] - буквальный» - это не необычный синтаксис, и я не думаю, что вы можете написать класс символов, когда вы говорите о дефисах, что работать одинаково под Java и Ruby. – Coderer

+1

Не может понять, почему кто-нибудь здравомыслящий написал бы такое заявление? если вы хотите иметь дефис как символ, а не оператор диапазона внутри '' [] 'поместите его в конец, это более стандартно. в отношении его использования в диапазоне, будучи многословным, часто лучше в смысле обслуживания, я не рекомендую людей, использующих [a- \ d], например. –

1

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

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

0

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

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

+0

Хочу ли я написать * это? Конечно нет. Ни за что. Но если вы когда-нибудь найдете это плавающим где-нибудь, не стесняйтесь обновлять свой ответ, и я соглашусь! : D – Coderer