正则表达式接受带或不带前导“+”的电话号码

时间:2016-02-01 13:58:26

标签: ruby regex

我正在尝试使用以下方法在我的控制器中查询并从我的数据库获取记录:

FeedBack.where(:phone => @customer.phone)

但我会@customer.phone选择以+开头。

+919123455667
911234567890

我需要在开头跳过+符号并获取两个方案的记录。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

像这样开始你的正则表达式:

/^\+?/

所以它匹配可选地以“+”开头的字符串。例如:

/^\+?[0-9]+/

或者你的意思是删除前导加号?

FeedBack.where(:phone => @customer.phone.gsub(/^\+?/, ''))

或者:

clearedPhone = @customer.phone.gsub(/^\+?/, '')
FeedBack.where(["phone='?' or phone='+?'", clearedPhone, clearedPhone])

或者:

FeedBack.where(:phone =>[clearedPhone, "+#{clearedPhone}"])

答案 1 :(得分:1)

我想从前缀+91您尝试匹配印度手机号码。以下是我的正则表达式。

RegEx /\+?(?:91)[789][0-9]{9}/

解释

1)\+?使+成为可选。

2)(?:91)91与前缀匹配。

3)[789] 印度中的移动电话号码以7 8 or 9开头,这与其中任何一个号码匹配。

4)[0-9]{9}匹配其余的9数字。

Regex101 Demo

答案 2 :(得分:1)

处理电话号码时,您还必须处理+45 34 45 65 26+61 2 9222 1234等空格。如果数据库中的电话号码都带有/不带+尝试:

def scrub_the_phone_number(number)
  number.gsub(/[^\d]/, '')
end

FeedBack.where(phone: scrub_the_phone_number(@customer.phone))

这是用空字符串替换所有非数字字符并返回结果。

但是,如果您的数据库包含各种格式的电话记录,则需要清理每种格式的数据或查询,如:

FeedBack.where("phone LIKE %?", scrub_the_phone_number(@customer.phone))

这将匹配以纯数结尾的任何内容。