Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 检查字符串是否包含电话号码_Ruby On Rails_Ruby_String - Fatal编程技术网

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

Ruby on rails 检查字符串是否包含电话号码,ruby-on-rails,ruby,string,Ruby On Rails,Ruby,String,试图找出如何解析出保留在字符串中的电话号码 e、 g 并且能够始终使用其他项目(例如,一些文本或链接)替换其中任何一项 我假设这是一种正则表达式类型的方法(我已经在用电子邮件做类似的事情,效果很好) 我必须 text.scan(/([^A-Z|^"]{6,})/i) 这给我留下了一个领先的空间,我不知道如何放弃(将感谢那里的帮助)。 有没有人们使用的标准方法 它还将内容放入数组中,这并不是特别有用 i、 e.如果有多个数字 [["02031234567"]["+44207-1234567"]

试图找出如何解析出保留在字符串中的电话号码

e、 g

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

我假设这是一种正则表达式类型的方法(我已经在用电子邮件做类似的事情,效果很好)

我必须

 text.scan(/([^A-Z|^"]{6,})/i)
这给我留下了一个领先的空间,我不知道如何放弃(将感谢那里的帮助)。 有没有人们使用的标准方法

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

i、 e.如果有多个数字

[["02031234567"]["+44207-1234567"]]
相对于

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

此模式将删除空格,但与第三种情况下的空格不匹配:

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

在第三个用例中添加空格是困难的。我认为成功满足该验收标准的唯一方法是将
#gsub
调用链接到您的
#scan

因此:

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

这就是我最后的结论,以防它对某人有所帮助

numbers = text.scan(/([^A-Z|^"]{6,})/i).collect{|x| x[0].strip }
这给了我一系列的

["+442031234567", "02031234567"]
我相信有一种更优雅的方法可以做到这一点,也许你会想检查一下这些数字,看看它们是否有可能像电话一样——例如,使用brilliant gem


这将有助于排除序列号等被识别为数字。显然,您需要将国家/地区代码更改为与您相关的代码。

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

text.scan(/(?<=[ ])[\d \-+()]+$|(?<=[ ])[\d \-+()]+(?=[ ]\w)/)
为了理解这个正则表达式,我们匹配的是:

  • [\d\-+()]+
    这是一个由一个或多个数字、空格、减号、加号、开始括号或结束括号组成的序列(以任何顺序排列-默认情况下,NB regex是贪婪的,因此它将尽可能多地匹配这些字符)

  • 前面必须加空格
    (?什么是“电话号码”)?如果你能用一个单数正则表达式来定义它,我想你会获得诺贝尔奖。不必担心它是否绝对正确。但必须有一种体面的接近方式……我很想把它标记为一个副本,但会把它留给其他人。你需要阅读“。你想做的很难,因为可能的格式有很多种,人们可以随意/不小心地改变他们的号码格式,所以去掉除了只能存在于电话号码中的值以外的所有内容,然后从那里开始。我可能应该澄清一下,我不需要将其转换为正确的电话号码。使用虚假宝石它比任何正则表达式都好。我更想清理字符串并删除其中的数字,知道我要删除的内容,所以我可以用一些可感知的东西替换它。它几乎就在那里,但在扫描之前删除了数字中的所有空格(我希望以后能够找到该字符串,并将其替换为对我没有帮助的内容)。例如,我只想删除前导空格,并保持其余字符串的起始位置不变。该数字是否确实必须前面加空格?例如,“给我打个电话(07123456789)”另一部分显然是一个改进,我不得不添加一个特殊的部分来删除前导冒号(因为许多电子邮件都有类似于“T:0123456789”的内容),这是前一个邮件接收到的。另外,我可能想添加“.”作为一个潜在的分隔符(显然很受欢迎).刚刚添加在上面。还有一个问题,即我们有一个标点符号,后跟一个电话号码。例如,“电话-02071234567”返回“-02071234567”作为数字。我试图涵盖您作为示例给出的案例。我想在尝试编写测试时考虑所有边缘案例是很重要的……下面是我用来测试正则表达式是否有效的快速代码:
    samples=[“给我打个电话(07123456789)”,“T:0123456789”]
    对于示例中的文本,请执行
    放置文本。扫描(/(?它开始变得非常令人困惑,因此您希望有非常好的测试来确保它工作。理想情况下,将正则表达式的构造函数分解为更小的步骤,然后您可以适当地进行注释,这样在接下来的几个月里您仍然可以知道发生了什么!!!!
    
    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")}
    
    text.scan(/(?<=[ ])[\d \-+()]+$|(?<=[ ])[\d \-+()]+(?=[ ]\w)/)
    
    ["02031234567"]
    ["+442031234567"]
    ["+44 (0) 203 123 4567"]
    ["0207-123-4567"]
    ["02031234567", "+44207-1234567"]