1

I持って、次の条件: 動的条件

if "FIX_STRING 0,0,DYNAMIC_STRING" == "FIX_STRING #{integer_from_0_to_5},#{integer_from_0_to_5},#{DYNAMIC_STRING}" 
    true 
else 
    false 
end 

がどのように動的に次のように作るには?

if "FIX_STRING 0,0,DYNAMIC_STRING" == "FIX_STRING #{/0|1|2|3|4|5/},#{/0|1|2|3|4|5/},#{/A|B|C|D/}" 
    true 
else 
    false 
end 
+2

あなたがここで何をしようとしているのかは本当に不明です。たぶんあなたの目標を平易な英語で説明する方が良いでしょう。 –

+0

正規表現を探していますか? 'if" FIX_STRING 0,0、DYNAMIC_STRING ".match(/ FIX_STRING [0-5]、[0-5]、[A-Z _] + /)true以外else false end '? DYNAMIC_STRING全体またはAからDまでの大文字の文字と一致する必要がありますか?より正確に質問してください。 – guitarman

答えて

2

あなたはここで正しい軌道に乗っていますが、非常に独特のコーディングスタイルがあります。まず、==のような比較では、ブール値がtrueまたはfalseであることが返されるため、ifが全く同じ結果を返す理由はありません。

もう1つは、文字列を別の文字列と比較しているため、と一致する必要があります。正確にはです。十分に近いとカウントされません。あなたが他の文字列を評価する場合は、混乱を取得する:あなたが正規表現に対して文字列をテストしようとしている場合

"FIX_STRING (?-mix:0|1|2|3|4|5),(?-mix:0|1|2|3|4|5),(?-mix:A|B|C|D)" 

最後に、あなたがこれを行う:

PATTERN = /\AFIX_STRING [0-5],[0-5],[A-D]\z/ 

をあなたはこの種をテストすることができますRubularにあるものを正しいものにする。ここでは[0-5]はその範囲のものを意味します。それはあなたが持っていたものの短い手です。

その後、あなたはこのパターンに対して任意の文字列をテストすることができます一致するようにするため

"FIX_STRING 3,4,D".match(PATTERN) 
# => #<MatchData "FIX_STRING 3,4,D"> 

を。

Rubyの新しいバージョンは、一致するものだけをテストするmatch?メソッドを持っています。これは一致したものを返しません。これは、2.3以降で実行している場合に使いたいかもしれません。単純なmatchメソッドよりも高速ですが、ループ内で多くのマッチを実行している場合にのみ重要です。

+1

Ruby 2.4では 'true'または' false'を返す 'Regexp#match?'を導入し、グローバル変数は設定しません。しかし、 'match? 'は2.3では利用できません。2.4では' String#match?'とは思われません。 – Stefan

+0

@Stefanああ、そうです、それは2.4です。 – tadman

関連する問題