0

私は現在、コードジェネレーターを構築しています。これは、使用する言語に関係なく、テンプレートや翻訳を記述したときにボイラープレートを生成することを目的としています。

Rubyの正規表現に問題があります。正規表現はとの間の任意のものを選択することを目的として{{{いる}}}ため、必要に応じて関数を生成できます。

私の正規表現は現在:

/\{\{\{(([a-zA-Z]|\s)+)\}\}\}/m

私のテストデータセットは次のとおりです。

{{{Demande    aaa}}} => {{{tagadatsouintsouin    tutu}}}

結果は次のとおりです。

[["Demande aaa", "a"], ["tagadatsouintsouin tutu", "u"]]

正規表現が最後の文字を2回選択するたび。それは私が望んでいることではありません、私はこのようなものがもっと必要です:

/\{\{\{((\w|\W)+)\}\}\}/m

しかし、これにも欠陥があり、結果は次のとおりです。

[["Demande aaa}}} => {{{tagadatsouintsouin tutu", "u"]]

一方、私は取得したい:

[["Demande aaa"],["tagadatsouintsouin tutu"]]

これらの正規表現を修正するにはどうすればよいですか?2セットの区切り文字を使用できますが、何も教えてくれません。

編集 :

すべての正規表現が私のデータサンプルに対して実行されるため、すべてのポイントが得られます。

正規表現はやり過ぎかもしれません、そしておそらく私の目的のためにはやり過ぎです。だから私は2つの質問があります。

まず、正規表現はまったく同じインデントを維持しますか?これにより、関数全体を処理できるはずです。

第二に、そのタスクに適したものはありますか?

このツールの目的の詳細な説明。php-symfonyでボイラープレートコードを書くのは退屈です。だから私はテンプレートに従ってこれを生成したいと思います。

私の意図は、この方法でいくつかのビュー、いくつかのコントローラー、さらにはモデルの一部を構築することです。

実用的な例:私のモデルでは、オブジェクトの属性のタイプに応じていくつかの関数を生成したいと思います。たとえば、お金を正しく表示する機能があります。したがって、属性に従ってcorect関数を作成し、m出力ファイル内に配置する必要があります。

したがって、それ自体が翻訳を必要とするいくつかの翻訳があります。

したがって、架空の例:

{{{euro}}} => {{{ function getMyAttributeEuro()
 {
   return formating($this->get[[MyAttribute]]);
 } }}}

翻訳をストックするために、次のような正規表現を使用する必要があります

少し賢いものを作りたいので、基本的なコードのほとんどをバグなしで作成できます。だから私は面白いコードに取り組むことができます。

4

4 に答える 4

4

かっこをキャプチャするセットが多すぎます。

/\{\{\{([a-zA-Z\s]+)\}\}\}/

また、正規表現には、動作に影響を与える/mドット()がないため、修飾子は必要ありません。.

于 2012-09-20T15:38:30.070 に答える
2

私は部分的です:

data = '{{{Demande    aaa}}} => {{{tagadatsouintsouin    tutu}}}'
data.scan(/\{{3}(.+?)}{3}/).flatten.map{ |r| r.squeeze(' ') }
=> ["Demande aaa", "tagadatsouintsouin tutu"]

また:

data.scan(/\{{3}(.+?)}{3}/).flatten.map{ |r| [ r.squeeze(' ') ] }
=> [["Demande aaa"], ["tagadatsouintsouin tutu"]]

また:

data.scan(/\{{3}(.+?)}{3}/).map{ |r| [ r[0].squeeze(' ') ] }
=> [["Demande aaa"], ["tagadatsouintsouin tutu"]]

サブアレイが必要な場合。

私は正規表現内で可能なすべてのことを試みることに大したことはありません。私はそれを短くて甘く保ち、探しているものが見つかったら出力を磨くことを好みます。正規表現は頭を痛めるので、これはメンテナンスの問題です。私は何年も前にそれらをマッチョなものと考えるのをやめました。正規表現は非常に便利なツールですが、多くの場合、すべての問題に対する答えと見なされますが、そうではありません。

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。

-ジェイミー・ザウィンスキー

于 2012-09-20T19:43:52.770 に答える
1

ちょっと一発

/\{\{\{([\w\W]+?)\}\}\}/

正規表現に貪欲でないものを追加しました

ここでこれはうまくいくようです

于 2012-09-20T15:36:47.033 に答える
1

キャプチャしないグループ(?:...)が必要ですが、別の方法があります。

/\{\{\{(.*?)\}\}\}/m
于 2012-09-20T15:40:11.393 に答える