0

正規表現の値を整数に、またはその逆に変換できるシステムを作成しようとしています。ここで、ゼロは最も基本的な正規表現(おそらく "/./")であり、後続の数値はより複雑な正規表現になります

これまでの私の最善のアプローチは、正規表現内に含めることができるすべての可能な値を配列に固定することでした。

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 )}/;

このアプローチの最大の問題は、無効な正規表現が簡単に生成される可能性があることです。

私が試していることを達成するためのすでに確立されたアルゴリズムはありますか?そうでない場合、何か提案はありますか?


スティーブに感謝

4

2 に答える 2

4

正規表現は、有限数の要素を再帰的に適用することで正式に定義できるため、これを行うことができます。要素を単純に連結するのではなく、正規表現の規則に従ってそれらを結合します。正規言語も帰納的可算であるため、これは確実に機能します。

ただし、これを実装するのはおそらくやり過ぎです。これは何のために必要ですか?キーと値のペアの単純な辞書は、Number -> RegExp正規表現を一意の数値に関連付けるのに適していませんか?

于 2009-05-27T13:22:45.003 に答える
1

//これが最も単純な正規表現 だと思います(何にでも一致します)。/./は、それ自体がはるかに長い式の省略形であるため、かなり複雑です/[^\n]/(その式が何であるかは文字セットによって異なります)。次の最も単純な式は、文字セットの最初の文字が/a/どこにあるかです。aその最後のステートメントは、列挙型に興味深い問題を引き起こします。どの文字セットを使用しますか?すべての列挙は、特定の文字セットに関連付けられます。//0から始めて、 /\x{00}/(ヌル文字と一致して)1と仮定します。/\x{01}/次に、ASCIIセットを使用した場合、129前後の興味深い正規表現(複数の文字列に一致するもの)に入り始めますが、UNICODE5.0の場合は最大1114112かかります。

全体として、より良い解決策は、数値をバイトのシーケンスとして扱い、それらのバイトを使用している文字セットにマップし、正規表現コンパイラを使用してその数値が有効な正規表現であるかどうかを判断し、有効ではありません。

于 2009-05-28T03:50:08.447 に答える