Ruby - 根据允许的字符验证用户输入

时间:2017-01-23 16:52:09

标签: ruby regex validation

我坚持验证用户输入。 我有一组允许的字符“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"

我知道正则表达式对于这个简单的任务来说太过分了,但我现在想不出别的东西。 任何帮助,将不胜感激.... 谢谢!

3 个答案:

答案 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
相关问题