解释Ruby方法gsub / scan

时间:2015-07-27 22:32:42

标签: ruby gsub

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

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

如果给出了电话号码,如1-999-999-9999,(999)999-9999,或其中的任何组合。

2 个答案:

答案 0 :(得分:2)

String#gsub用于将特定文本替换为另一个字符串。例如,"hello world".gsub(/hello/, "goodbye")会产生"goodbye world"。非爆炸变体gsub不会修改字符串本身;而爆炸变体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。但如果输入中有多个电话号码,它最终会加入一段时间的电话号码。

希望有所帮助。

答案 1 :(得分:0)

info["phone"] = info["phone"].stuff - 替换数组/ hash /中的原始内容

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

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

.join('.') - 组合数组的所有元素,并在点之间创建一个带点的字符串。

因此...

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