我试图解释这行代码中发生的事情:
info["phone"] = info["phone"].gsub!(/\D/,"").scan(/1?(\d{3})(\d{3})(\d{4})/).join('.')
如果给出了电话号码,如1-999-999-9999,(999)999-9999,或其中的任何组合。
答案 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'