2017-01-23 99 views
2

我被困在驗證用戶輸入。 我有一套允許的字符「R G B Y」,我要求用戶輸入。我想驗證用戶是否只輸入允許的字符(「R G B Y」)。Ruby - 根據允許的字符驗證用戶輸入

用戶可以輸入任何他或她想要只要輸入包括不允許的字符,例如:

user_input1 = "R R R Y" 
user_input2 = "Y Y B G" 

等等...

我完全卡住,我試着用正則表達式:

/[RGBY]/ 

它工作正常,如果用戶輸入允許的字符,但是否會有的允許和不允許的字符的混合,正則表達式不會趕上它:(例如:

wrong_user_input = "Z Z R Y" 

我知道正則表達式是矯枉過正這個簡單的任務,但我想不出其他的在這一刻的東西。 任何幫助,將不勝感激.... 謝謝!

+0

是「RRRY」也是允許的,或應該有始終空間其間? –

回答

2

使用/^[RGBY ]+$/作爲圖案,因此,從一開始(^)到結束($)(不是部分)整個字符由允許的字符(R,G,B,Y,或空間):

>> "Z Z R Y" =~ /^[RGBY ]+$/ 
=> nil 
>> "R R R Y" =~ /^[RGBY ]+$/ 
=> 0 
+0

謝謝,我被卡住這麼多,我忘記了一個字符串的開始和結束:)這完全解決了我的問題,非常感謝你,現在我可以繼續前進! – zensupremacy

+0

@zensupremacy,不客氣。快樂編程! – falsetru

2

有一個相關的問題前一陣子,這出來的最快的解決方案:

"Z Z R Y".count("^RGBY ") == 0 
#=> false 
"R G R Y".count("^RGBY ") == 0 
#=> true 

據統計未R,G,B,Y或空格字符。

+0

感謝您的回答,我正在做什麼,速度真的沒有多大關係 – zensupremacy

1

這裏有一些更多的方法,其中一些不使用正則表達式。

的否定:字符串包含超過"R""G""B""V"" "

!('Z Z R Y' =~ /[^RGBY ]/) #=> false 
!('R R R Y' =~ /[^RGBY ]/) #=> true 

這就避免了錨的需要以外的字符。

使用字符串#刪除刪除目標字符,然後看看是否有任何字符則保留

'Z Z R Y'.delete('RGBY ').empty? #=> false 
'R R R Y'.delete('RGBY ').empty? #=> true 

一個變型,使用String#tr

'Z Z R Y'.tr('RGBY ', '').empty? #=> false 
'R R R Y'.tr('RGBY ', '').empty? #=> true 

另一種是使用String#gsub用正則表達式:

'Z Z R Y'.gsub(/[RGBY ]/, '').empty? #=> false 
'R R R Y'.gsub(/[RGBY ]/, '').empty? #=> true 

轉換的字符串字符數組,並使用一個邏輯比較

arr = ['R', 'G', 'B', 'Y', ' '] 

('Z Z R Y'.chars - arr).empty? #=> false 
('R R R Y'.chars - arr).empty? #=> true 
+0

感謝讓我知道有這麼多的可能性 – zensupremacy