简单的正则表达式检查在轨道模型中失败



>我检查了以下类型

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?"

最新更新