我坚持验证用户输入。 我有一组允许的字符“R G B Y”,我要求用户输入。我想验证用户是否仅输入允许的字符(“R G B Y”)。
只要输入包含允许的字符,用户就可以输入他或她想要的任何内容,例如:
user_input1 = "R R R Y"
user_input2 = "Y Y B G"
依旧......
我完全陷入困境,我尝试使用正则表达式:
/[RGBY]/
如果用户输入允许的字符,它工作正常,但如果有允许和不允许字符的混合,正则表达式将无法捕获它:(例如:
wrong_user_input = "Z Z R Y"
我知道正则表达式对于这个简单的任务来说太过分了,但我现在想不出别的东西。 任何帮助,将不胜感激.... 谢谢!
答案 0 :(得分:3)
使用/^[RGBY ]+$/
作为模式,以便从开头(^)到结尾($)(不是部分)整个字符由允许的字符(R,G,B,Y或空格)组成:
>> "Z Z R Y" =~ /^[RGBY ]+$/
=> nil
>> "R R R Y" =~ /^[RGBY ]+$/
=> 0
答案 1 :(得分:2)
前一段时间有一个相关的问题,这是最快的解决方案:
"Z Z R Y".count("^RGBY ") == 0
#=> false
"R G R Y".count("^RGBY ") == 0
#=> true
计算不是R,G,B,Y
或空格的字符。
答案 2 :(得分:1)
以下是一些方法,其中一些不使用正则表达式。
否定:字符串包含"R"
,"G"
,"B"
,"V"
和" "
<以外的字符/ p>
!('Z Z R Y' =~ /[^RGBY ]/) #=> false
!('R R R Y' =~ /[^RGBY ]/) #=> true
这避免了对锚的需求。
使用String#delete删除目标字符,然后查看是否还有任何字符
'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