检查字符串是否包含电话号码

时间:2015-06-24 16:26:24

标签: ruby-on-rails ruby string

尝试解析如何解析字符串中剩余的电话号码。

e.g。

 "Hi Han, this is Chewie, Could you give me a call on 02031234567"
 "Hi Han, this is Chewie, Could you give me a call on +442031234567"
 "Hi Han, this is Chewie, Could you give me a call on +44 (0) 203 123 4567"
 "Hi Han, this is Chewie, Could you give me a call on 0207-123-4567"
 "Hi Han, this is Chewie, Could you give me a call on 02031234567 OR +44207-1234567"

并且能够始终用其他项目(例如某些文本或链接)替换其中任何一项。

我认为这是一种正则表达式的方法(我已经做过与电子邮件类似的工作了。)

我必须

 text.scan(/([^A-Z|^"]{6,})/i)

这给我留下了一个领先的空间,我可以解决如何放弃(希望得到帮助)。 是否有人们使用的标准方法?

它还会将内容放入数组中,这并不是特别有用

即。如果有多个号码。

[["02031234567"]["+44207-1234567"]]

而不是

["02031234567","+44207-1234567"]

4 个答案:

答案 0 :(得分:5)

使用空格添加第三个用例很困难。我认为成功达到接受标准的唯一方法是将#gsub电话连接到您的#scan

因此:

text.gsub(/\s+/, "").scan(/([^A-Z|^"|^\s]{6,})/i)

答案 1 :(得分:3)

以下代码将为您提取所有数字:

text.scan(/(?<=[ ])[\d \-+()]+$|(?<=[ ])[\d \-+()]+(?=[ ]\w)/)

对于您提供的示例,结果如下:

["02031234567"]
["+442031234567"]
["+44 (0) 203 123 4567"]
["0207-123-4567"]
["02031234567", "+44207-1234567"]

要理解这个正则表达式,我们匹配的是:

  • [\d \-+()]+这是一个包含一个或多个数字,空格,减号,加号,打开或关闭括号的序列(按任意顺序 - 默认情况下,NB正则表达式是贪婪的,所以它将匹配下一个这些字符的数量尽可能彼此)
  • 必须以空格(?<=[ ])开头 - 注意,未捕获正面后视空间,因此确保结果中没有前导空格
  • 并且位于字符串$的末尾,或者|后跟一个空格,然后是单词字符(?=[ ]\w)(注意,此前瞻不会被捕获)

答案 2 :(得分:0)

这种模式将摆脱空间,但与第三种情况不符合空格:

/([^A-Z|^"|^\s]{6,})/i

答案 3 :(得分:0)

这是我最终得到的,以防有人帮助

["+442031234567", "02031234567"]

这给了我一系列的

numbers = text.scan(/([^A-Z|^"]{6,})/i).collect{|x| x[0].strip }
real_numbers = numbers.keep_if{|n| Phony.plausible? PhonyRails.normalize_number(n, default_country_code: "GB")}

我确信有一种更优雅的方式可以做到这一点,并且你可能想要检查数字是否有可能是语音 - 例如使用辉煌的Phony宝石。

<link>

哪个应该有助于排除序列号等被识别为数字。您显然希望将国家/地区代码更改为与您相关的内容。