1

我有以下类型的支票

 validates :callback_handle, :format => { :with => /[_0-9a-zA-Z]+/ix }, :unless  => "callback.nil?"

我不希望任何非 0-9、az AZ 字符通过。所以我将 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。

有人可以告诉我我的理解有什么问题吗?

编辑:我发现 =~ 将返回匹配的位置。所以问题变成了我如何不允许具有任何其他字符的东西不匹配?

4

2 回答 2

3

您的正则表达式仍然能够匹配,因为您的字符串中至少有 1 个字母数字字符。如果要确保整个字符串匹配,则应定义匹配的开头和结尾。

老的:

a =~ /[_0-9a-zA-Z]+/ix

这就是说“在a.

新的:

a =~ /\A[_0-9a-zA-Z]+\z/ix

这就是说“从字符串的开头开始,然后至少匹配这些字符中的 1 个,然后是字符串的结尾” a

于 2012-12-21T18:23:28.777 回答
1

您的正则表达式只是要求您的字符串包含 1 个或多个有效字符......这应该可以解决它:

 validates :callback_handle, :format => { :with => /^[_0-9a-zA-Z]+$/ix }, :unless  => "callback.nil?"
于 2012-12-21T18:23:10.557 回答