0

モデルの次の形式に従って、入力証拠番号を検証する必要があります。

XXX-### 
XXX-#### 
XXX-##### 
XXX-######
XXXX-#####

XXXXはアルファベット、####は数字です

モデルコードには次のようなものがあります。

validates_format_of :evidence_number, :with=> /[A-Z a-z]{3}-\d{3,6}/

3未満の数字に対してのみ機能します。つまり、XXX-12に対しては機能しますが、6を超える数字に対しては機能しません。つまり、XXX-1234567に対しては機能しません。

4

4 に答える 4

3

(行頭) と (行末) ではなく、 (\A文字列の先頭) と\z(文字列の終わり) アンカーを使用する必要があります。^$

validates_format_of :evidence_number, :with=> /\A[A-Z a-z]{3}-\d{3,6}\z/

簡単な例で違いを説明します。

>> "wrong\nXXX-999\nanchors" =~ /^[A-Z a-z]{3}-\d{3,6}$/
=> 6
>> "wrong\nXXX-999\nanchors" =~ /\A[A-Z a-z]{3}-\d{3,6}\z/
=> nil
>> "XXX-999" =~ /^[A-Z a-z]{3}-\d{3,6}$/
=> 0
>> "XXX-999" =~ /\A[A-Z a-z]{3}-\d{3,6}\z/
=> 0

ほとんどの場合、Rubyでは\Aand\zの代わりに^andを使用します。$

ハイフンの後に「少なくとも 3 桁」が必要な場合は、次のようにします。

/\A[A-z a-z]{3}-\d{3,}\z/

ケニー・グラントの言うとおり、文字クラスのそのスペースは奇妙に見えます。

于 2012-08-29T20:25:08.003 に答える
1

^開始と$終了を追加してみてください。

validates_format_of :evidence_number, :with=> /^[A-Za-z]{3,4}-\d{3,6}$/

mu is too shortただし、の答えを使用してください。

于 2012-08-29T19:59:22.370 に答える
1

いくつかのテスト コードをセットアップし、正規表現を個別にテストすることをお勧めします (または、理想的には、単体テストをセットアップしてその方法でテストします)。

invalid   = %w[777-2345 ABCD-12 ABCD-12345678 AB-12345678 ABC-1234567]
valid     = %w[ABC-12345 ABCD-123 ABCD-1234 ABCD-12345 ABCD-123456]

def validate codes,regex
  codes.each do |code|
  if code =~ regex
     puts "Valid code #{code}" 
   else
     puts "Invalid code #{code}"
   end
 end
end

上記を正規表現でテストすると、いくつかの問題が発生します。あなたの説明から、正規表現に許可された文字としてスペースが含まれている理由がわかりません。コードの場合、これは有効なコードではないようです。したがって、次のような方が良いかもしれません:

/\A[A-Za-z]{3,4}-\d{3,6}\z/

一致を完全な文字列に制限し、最初の一致を 3 つまたは 4 つの英字に制限し、最後の一致を 3 ~ 6 の数字に制限します。これは、あなたの例で #### が間違いではないことを前提としています:

puts "\n\nUSING NEW REGEX"
puts "Validating valid codes"
validate valid,/\A[A-Za-z]{3,4}-\d{3,6}\z/
puts "\nValidating INVALID codes"
validate invalid,/\A[A-Za-z]{3,4}-\d{3,6}\z/
于 2012-08-29T20:34:24.043 に答える
0

文字列の最初と最後に正規表現文字を追加します。

validates_format_of :evidence_number, :with=> /^[A-Z a-z]{3}-\d{3,6}$/

ruby-1.9.3-p125 :000 > "ABC-1234567".match /[A-Z a-z]{3}-\d{3,6}/
 => #<MatchData "ABC-123456"> 
ruby-1.9.3-p125 :001 > "ABC-1234567".match /^[A-Z a-z]{3}-\d{3,6}$/
 => nil 
于 2012-08-29T19:58:49.763 に答える