Ruby Quiz book の問題 #6 を解こうとしています。この問題は、正規表現クラスに対して呼び出される新しいメソッドを作成する必要があることを示しています。このメソッドbuild()
では、整数または範囲を渡し、許可された数値を検出するために正規表現を生成する必要があります。
例えば:
lucky = Regexp.build(3, 7)
"7" =~ lucky # => true
"13" =~ lucky # => false
"3" =~ lucky # => true
month = Regexp.build(1..12)
"0" =~ month # => false
"1" =~ month # => true
"12" =~ month # => true
バグのあるバージョンを開発しましたが、期待どおりに動作しません。私の問題は、正しい正規表現を生成することです。私が Rubular で試したすべてのパターンは、本来あるべきものを取りません。たとえば、Regexp.build(1, 3, 5)
次のようなパターンを取得しました。
/^1|3|5$/
これは機能し、 と に一致1
し3
ます5
。15
しかし、 orにも一致し13
ます。
数値がそれらの間で結合しないようにする最良の方法は何ですか?
- - 編集
グループを使用すると、適切に機能するようになりました。とにかく、範囲を表す正規表現を取得する方法はありますか? たとえば、前の例を維持します。
lucky = Regexp.build(1..12)
"7" =~ lucky # => true
"13" =~ lucky # => false
"0" =~ lucky # => false
"5" =~ lucky # => true
Regexp.build によって生成される正規表現は、1 から 12 までのすべての値と一致する必要がありますが、それ以上は一致しません。私はウェブを検索してきましたが、この種の正規表現をプログラムで生成するのは複雑であることがわかりました。このタスクの具体的または事前定義された方法はありますか?
http://utilitymill.comにはそれを実現するための再帰関数がありますが、ちょっと複雑だと思います。