如何编写正则表达式不允许这个带有换行符的电话号码?

时间:2016-08-20 09:20:30

标签: ruby-on-rails regex rspec rspec-rails

我有问题写正则表达式通过最后一次测试,电话号码值等于“+48 999 888 777 \ naseasd”。这是我的文件。我做错了什么?

应用程序/模型/ user.rb

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :trackable, :validatable

  validates :phone_number, format: { with: /[+]?\d{2}(\s|-)\d{3}(\s|-)\d{3}(\s|-)\d{3}/, allow_nil: true }

end

规格/模型/ user_spec.rb

require 'rails_helper'

describe User do

  it { is_expected.to allow_value('+48 999 888 777').for(:phone_number) }
  it { is_expected.to allow_value('48 999-888-777').for(:phone_number) }
  it { is_expected.to allow_value('48 999-888-777').for(:phone_number) }
  it { is_expected.not_to allow_value('+48 aaa bbb ccc').for(:phone_number) }
  it { is_expected.not_to allow_value('aaa +48 aaa bbb ccc').for(:phone_number) }
  it { is_expected.not_to allow_value("+48 999 888 777\naseasd").for(:phone_number) }

end

控制台出错:

Failures:

1) User should not allow phone_number to be set to "+48 999 888 777\naseasd"
 Failure/Error: it { is_expected.not_to allow_value("+48 999 888 777\naseasd").for(:phone_number) }
   Expected errors  when phone_number is set to "+48 999 888 777\naseasd", got errors: ["can't be blank (attribute: \"email\", value: \"\")", "can't be blank (attribute: \"password\", value: nil)"]
 # ./spec/models/user_spec.rb:9:in `block (2 levels) in <top (required)>'

1 个答案:

答案 0 :(得分:0)

it { is_expected.not_to allow_value("+48 999 888 777\naseasd").for(:phone_number) }

表示您希望模式仅匹配整个字符串。

在开头添加\A,在模式结尾添加\z

请注意^匹配Ruby中一行的开头(而$匹配行的末尾),而在RoR中通常会导致异常。 \z锚点优于\Z用于验证,因为\Z可以在字符串中的最后换行符之前匹配,\z仅匹配字符串的最后一行。< / p>