【问题标题】:explain Ruby method gsub/scan解释 Ruby 方法 gsub/scan
【发布时间】:2015-07-27 22:32:41
【问题描述】:

我试图解释这行代码中发生的事情:

info["phone"] = info["phone"].gsub!(/\D/,"").scan(/1?(\d{3})(\d{3})(\d{4})/).join('.')

如果提供了电话号码,例如 1-999-999-9999、(999)999-9999 或任何组合。

【问题讨论】:

标签: ruby gsub


【解决方案1】:

String#gsub 用于将特定文本替换为另一个字符串。例如,"hello world".gsub(/hello/, "goodbye") 将导致 "goodbye world"。非爆炸变体gsub 不会修改字符串本身;而 bang 变体 gsub! 会:

test = "hello world"
test.gsub(/h[ae]ll[ou]/, "goodbye") # => "goodbye world"
test # => "hello world"
test.gsub!(/h[ae]ll[ou]/, "goodbye") # => "goodbye world"
test # => "goodbye world"

String#scan“扫描”字符串中的某个模式,并返回一个出现的数组。这对于从字符串中提取某些内容很有用:

tweet = "@github @you hello, world!"
tweet.scan(/@[\w]+/) # => ["@github", "@you"]

但是,如果您在扫描中包含组,它会返回一个包含组匹配数组的数组:

tweet.scan(/@([\w]+)/) # => [["github", "you"]]

所以,.gsub!(/\D/, "") 所做的就是从字符串中删除所有非数字字符,并修改字符串(这最后一点现在并不重要)。 .scan 从输入中查找电话号码(电话号码是可选的 1,后跟一组三位数,然后是一组三位数,然后是一组四位数)。由于它会从输入中删除所有非数字,因此它将尝试从输入中的前 10 个或 11 个数字创建一个电话号码,并且每超过 10 个或 11 个数字。

但是,join 将数字集连接成一个字符串 999.999.9999。但是如果输入中有多个电话号码,它最终也会用句点连接这些电话号码。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    info["phone"] = info["phone"].stuff - 替换array/hash/whatever中原来的

    .gsub!(/\D/,"") - 删除所有非数字,例如括号或连字符。 (请注意,您不需要 ! 在 gsub 中!)

    .scan(/1?(\d{3})(\d{3})(\d{4})/) - 国家代码 1 开头。然后三个数字在第一个匹配组中。然后是第二个匹配组中的三个数字,最后一个是 4 个。这些组被放入一个数组中。

    .join('.') - 将数组的所有元素组合起来,组成一个带点的字符串。

    所以...

    '1+(555)123-4567' 将更改为 '555.123.4567'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      相关资源
      最近更新 更多