2011-12-21 4 views
16

私はthis questionを見てきました。経験から、どの言語も正規表現の異なる方言をサポートしているようです。私はこの問題が長い間起こっていたと考えているので、誰かは何かしたいと思っているに違いない。同じ正規表現をさまざまなプログラミング言語で使用するにはどうすればよいですか?

私は、JavaScript、Ruby、Javaを含むかなり大きなプロジェクトを持っており、それらのすべてが同じ正規表現に触れなければなりません。私たちはJavaを「公式」RE通訳者として選びました。これは、他の2つの言語がREを評価する必要があるときはいつも、それをJavaプログラムに何とか渡す必要があることを意味します。

REの方言を選んで、少なくともすべての言語から半基本的に呼び出すことができれば、私たちにとって大きな前進となります。これは可能ですか?すでにやっているのですか?私たちはPCREを見て、それはという技術的にはJavaとRubyからのネイティブバインディングを使って呼び出すことが可能ですが(JSは寒いところですが)、実際に誰かを見つけられませんでした。私たちは一人ですか?

ETA:私は言及しませんでしたが、このシステムはユーザが正規表現を適用しているということです。 (はい、私はこれがsecurity issueなどであることを理解していますが、それは信頼された帰属ユーザによる社内使用のためです)私は確かに避けるために "これをやってはいけない"私はそれが最善の解決策ではないことを願っています。

+1

ああ、ユーザ指定の正規表現。 ) – BoltClock

+0

(誰かが気にしている場合に備えて、私たちが使用していたストップギャップを掲示したかったのですが、私はまだもっと良いことを聞きたいと思っています)Java正規表現を選びました。 RubyがJRubyで実行されている場合、Rubyコードからこれらをネイティブに実行できます。私たちの目的のために、それは十分です。また、RESTfulなサービスとして、基本的にテストデータとの正規表現を実行するJavaサーブレットを作成しました。これはJavaScriptの終わりを処理しますが、それはあまり美しいものではありません: -/ – Coderer

答えて

11

あなたの投稿に暗黙のうちに言及された方言は、それほど異なるものではなく、他のものによってサポートされているものがありますが、実際には特にターゲットとする正規表現を書かない限り問題の方言の一つ。

あなたは、次のリンクで使用可能なテーブルでの方言の違いを見ることができます:


それらの間の主な違いは、より「高度」な機能のは、正規表現。これらを使用しないようにしておくと、セーフゾーンに入ります。 PythonとJavaの両方を使用すると、すべての式ではJavaScriptが書かれるべきであると言って、その後、将来の開発者はそれらに利用可能なモジュールを使用することができますJavaScriptのネイティブ実行のために利用可能なモジュールを持っているので


、正規表現が実行されたことを確認します常にまったく同じように動作します。

私は、使用している正規表現が3つの言語すべてでサポートされている必要があり、使用可能なものを検索する必要があるという旨の表(以前にリンクされた表など)使用する。

。あなた自身のリスト/テーブルをコンパイルできます。

+2

+1その素晴らしいリンク! –

+0

素晴らしい素晴らしいリンクですが、実際には*重要ではない*高度な機能があることに気付きました。私に飛びつく最初のことは、「ハイフン[\ dz]はリテラルです」です。これは珍しい構文ではなく、ハイフンについて話しているときに文字クラスを書くことはできないと思います。 JavaとRubyの両方で同じように動作します。 – Coderer

+1

なぜ誰もそんなに文章を書こうと思っていないのですか?ハイフンをcharとして扱い、 '' [] 'の中に範囲演算子を入れたくないのなら、それを最後に置くほうがより標準的です。遠隔地での使用に関しては、冗長であることがメンテナンスの面で優れていることが多いため、[a- \ d]を使用する人はおすすめしません。 –

1

これらの方言はすべてわずかに異なりますが、ほぼすべての主要ポイントで重複しています。 (主な相違点は、正規表現そのものではなく、どのように呼び出すか(ある言語のfindmatchesなど)、正規表現リテラルをサポートすることです(ある言語の//は別の生の文字列です。 。)

Javaの特殊性をサポートするためにJavaScriptを使用するのではなく、3つの言語間で共通の正規表現の大きなサブセットに限定し、ユニットテストを使用して正規表現は3つすべてで同じように動作します。

0

1つの(重量級)オプションは、正規表現で書かれた正規表現(例えばPerlの正規表現)を入力として受け入れることができる「正規表現クロスコンパイラ」を構築し、それをスキャンして解析する構文木を生成し、他の言語(PythonやJavaなど)の正規表現を出力します。これにより、正規表現を一度書くことができ、コンパイラはフォーマット間の変換作業をすべて行うので、どこでも動作させることができます。

希望すると便利です。

+0

これを書いて*書きますか?地獄いいえ。とんでもない。しかし、どこかに浮かんでいるのを見つけたら、あなたの答えを更新してください。私はそれを受け入れます! :D – Coderer

関連する問題