>我检查了以下类型
validates :callback_handle, :format => { :with => /[_0-9a-zA-Z]+/ix }, :unless => "callback.nil?"
我不希望任何非 0-9、a-z A-Z 字符通过。所以我callback_handle设置为 "!alksjda"(注意!在开头)。 此测试不会失败。我做错了什么?
我在 irb 上尝试了一些事情:这就是我得到的:
1.9.2-p320 :001 > a = "!askldjlad"
=> "!askldjlad"
1.9.2-p320 :002 > a =~ /[_0-9a-zA-Z]+/ix
=> 1
1.9.2-p320 :003 > a = "askldjlad"
=> "askldjlad"
1.9.2-p320 :004 > a =~ /[_0-9a-zA-Z]+/ix
=> 0
我以为它会在找不到匹配项时返回 false 或 nil。
有人可以告诉我在我的理解中有什么问题吗?
编辑: 我发现=~将返回比赛的位置。 所以问题变成了我如何不允许具有任何其他字符不匹配的东西?
您的正则表达式仍然能够匹配,因为字符串中至少有 1 个字符是字母数字。如果要确保整个字符串匹配,则应定义匹配的开始和结束。
老:
a =~ /[_0-9a-zA-Z]+/ix
这是说"在a
某处至少匹配这些角色中的一个。
新增功能:
a =~ /A[_0-9a-zA-Z]+z/ix
这是在a
中说"从字符串的开头开始,然后只匹配这些字符中的至少 1 个,然后是字符串的末尾"。
您的正则表达式仅要求字符串包含 1 个或多个有效字符......这应该可以解决它:
validates :callback_handle, :format => { :with => /^[_0-9a-zA-Z]+$/ix }, :unless => "callback.nil?"