質問
私は整数とその逆に正規表現の値を変換することができるシステムを作成しようとしています。ゼロは、最も基本的な正規表現(おそらく"/./"
)になると、それ以降の数字は、より複雑な正規表現ののようになります。
私の最善のアプローチは、これまでの配列に正規表現の中に含まれていることができ、すべての可能な値を固執することでした。
values = [ "!", ".", "\/", "[", "]", "(", ")", "a", "b", "-", "0", "9", .... ]
、その後、次のようにその配列から取る:
def get( integer )
if( integer.zero? )
return '';
end
integer = integer - 1;
if( integer < values.length )
return values[integer]
end
get(( integer / values.length ).floor) + get( integer % values.length);
end
sample_regex = /#{get( 100 )}/;
は、このアプローチの最大の問題であることの無効な正規表現を容易に生成することができます。
私がしようとしているものを達成するためにすでに確立されたアルゴリズムはありますか?そうでない場合は、任意の提案ですか?
ありがとう
スティーブ
解決
私は//
は、最も単純な正規表現(それが何にマッチする)であることを言うでしょう。それ自体がはるかに長い表現(何発現があることは、あなたの文字セットに依存します)のためだけに簡略化したものです/./
のためだけの速記が、あるので、/[^\n]/
はかなり複雑です。 /a/
があなたの文字セットの最初の文字がどこにある次の最も単純な式はa
されるだろう。その最後の文は、あなたの列挙に興味深い問題が表示されます:あなたは、どのような文字セットを使用するのでしょうか?任意の列挙は、与えられた文字セットに縛られます。あなたは0として//
で始まると仮定すると、/\x{00}/
等は、次にあなたが面白い正規表現に入るために開始すると、2のように、1としてあなたはASCIIセットを使用した場合129の周りに(複数の文字列にマッチするものを)/\x{01}/
を(NUL文字にマッチ)が、それはUNICODE 5.0のために1114112までかかるだろう。
すべてのすべてで、私はよりよい解決策は、一連のバイトとして数を扱い、使用しているものは何でも、文字セットの中にそれらのバイトをマップし、その数は、有効な正規表現であるかどうかを判断するために正規表現コンパイラを使用し、廃棄していると言うでしょう有効でない数字ます。
他のヒント
、これは行うことができます。代わりに、単に要素を連結し、正規表現のルールに従ってそれらを結合します。正規言語でも帰納的可算にあるので、これは動作することが保証されます。
しかし、それはこれを実装するのは非常におそらく行き過ぎです。あなたはこれを何が必要ですか? Number -> RegExp
キーと値のペアの簡単な辞書はユニークな番号を持つ正規表現を関連付けることにより適したのではないでしょうか?