在 phone 号码中添加 '-' 以及分机号
Add the '-' in the phone number, along with the ext
我需要一种方法来将“-”添加到 phone 号码中,验证它的长度是否正确,在区号周围添加括号,如果没有给出分机号则默认为 nil。例如:
9876542123 ext: 6789 -> Should end up -> (987)654-2123 ext: 6789
4543456 -> should fail
9876785678 ext: -> should end up -> (987)678-5678
如果没有正则表达式,我该如何做到这一点?
我尝试过的:
def format_phone_number(num)
num.insert(0, '(').insert(-3, ')').insert(-4, '-')
end
输出:
(12345678-)94
以下内容应该与您正在查找的内容非常相似。当您将一个字符插入到一个字符串中时,您必须记住您将字符串的长度增加 1。此外,使用带插入的负索引,将字符插入位置 num.length - index
.
def format_phone_number(num)
if num.length >= 10
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
end
如果 phone 号码长度不合适,我不确定你想要什么 return。
您必须处理每次调用 insert
时更改字符串大小的副作用:
def format_phone_number(num)
num.insert(0, '(')
puts num #=> (9876785678
puts num.size #=> 11
num.insert(4, ')')
puts num #=> (987)6785678
puts num.size #=> 12
num.insert(8, '-')
puts num #=> (987)678-5678
puts num.size #=> 13
end
format_phone_number("9876785678")
要处理 phone 个少于 10 个字符的数字,您可以 raise
一个例外:
def format_phone_number(num)
raise "Less than 10 chars" if num.size < 10
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
format_phone_number "9876785678" #=> (987)654-2123
format_phone_number "9876542123 ext: 6789" #=> (987)654-2123 ext: 6789
format_phone_number "9876542123 ext:" #=> (987)654-2123 ext:
format_phone_number "987678567" #=> in `format_phone_number': Less than 10 chars (RuntimeError)
我真的不明白为什么,但这行得通:
def format_phone_number(num)
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
当我输入:
1234567894 -> (123)456-7894
这个问题很好地说明了使用正则表达式解决这类问题的好处。让我们比较使用正则表达式的方法和不使用正则表达式的方法,以获得相同级别的功能(如示例中所体现的)。
使用正则表达式
R = /
\A # match beginning of string
(\d{3}) # match 3 digits in capture group 1
(\d{3}) # match 3 digits in capture group 2
(\d{4}) # match 3 digits in capture group 3
( # begin capture group 4
\sext: # match space, string
(?:\s\d+)? # optionally match space, >= 1 digits in non-capture group
\z # match end of string
| # or
\z # match end of string
) # end capture group 4
/x # free-spacing regex definition mode
def format_phone_number(num)
return nil unless (num.strip) =~ R
ext = ( == " ext:") ? '' :
"(%s)%s-%s%s" % [, , , ext]
end
format_phone_number "9876542123 ext: 6789" #=> "(987)654-2123 ext: 6789"
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789"
format_phone_number "9876785678 ext:" #=> "(987)678-5678"
format_phone_number "9876785678" #=> "(987)678-5678"
format_phone_number "4543456" #=> nil
format_phone_number "#9876785678" #=> nil
format_phone_number "98765421234 ext: 6789" #=> nil
format_phone_number "9876542123 ext.: 6789" #=> nil
format_phone_number "9876542123 ext:6789" #=> nil
format_phone_number "9876542123 ext: 6789#" #=> nil
format_phone_number "9876542123ext: 6789" #=> nil
不要使用正则表达式
def format_phone_number(num)
str = num.strip
return nil if str.size < 10
nbr, ext = str[0,10], str[10..-1]
ext = "" if ext == " ext:"
return nil unless (Integer(nbr) rescue false)
return nil unless ext.empty? || ext[0,6] == " ext: "
return nil unless (ext.empty? || (Integer(ext[6..-1]) rescue false))
"(%s)%s-%s%s" % [num[0,3], num[3,3], num[6,4], ext]
end
format_phone_number "9876542123 ext: 6789" #=> "(987)654-2123 ext: 6789"
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789"
format_phone_number "9876785678 ext:" #=> "(987)678-5678"
format_phone_number "9876785678" #=> "(987)678-5678"
format_phone_number "4543456" #=> nil
format_phone_number "#9876785678" #=> nil
format_phone_number "98765421234 ext: 6789" #=> nil
format_phone_number "9876542123 ext.: 6789" #=> nil
format_phone_number "9876542123 ext:6789" #=> nil
format_phone_number "9876542123 ext: 6789#" #=> nil
format_phone_number "9876542123ext: 6789" #=> nil
我需要一种方法来将“-”添加到 phone 号码中,验证它的长度是否正确,在区号周围添加括号,如果没有给出分机号则默认为 nil。例如:
9876542123 ext: 6789 -> Should end up -> (987)654-2123 ext: 6789
4543456 -> should fail
9876785678 ext: -> should end up -> (987)678-5678
如果没有正则表达式,我该如何做到这一点?
我尝试过的:
def format_phone_number(num)
num.insert(0, '(').insert(-3, ')').insert(-4, '-')
end
输出:
(12345678-)94
以下内容应该与您正在查找的内容非常相似。当您将一个字符插入到一个字符串中时,您必须记住您将字符串的长度增加 1。此外,使用带插入的负索引,将字符插入位置 num.length - index
.
def format_phone_number(num)
if num.length >= 10
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
end
如果 phone 号码长度不合适,我不确定你想要什么 return。
您必须处理每次调用 insert
时更改字符串大小的副作用:
def format_phone_number(num)
num.insert(0, '(')
puts num #=> (9876785678
puts num.size #=> 11
num.insert(4, ')')
puts num #=> (987)6785678
puts num.size #=> 12
num.insert(8, '-')
puts num #=> (987)678-5678
puts num.size #=> 13
end
format_phone_number("9876785678")
要处理 phone 个少于 10 个字符的数字,您可以 raise
一个例外:
def format_phone_number(num)
raise "Less than 10 chars" if num.size < 10
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
format_phone_number "9876785678" #=> (987)654-2123
format_phone_number "9876542123 ext: 6789" #=> (987)654-2123 ext: 6789
format_phone_number "9876542123 ext:" #=> (987)654-2123 ext:
format_phone_number "987678567" #=> in `format_phone_number': Less than 10 chars (RuntimeError)
我真的不明白为什么,但这行得通:
def format_phone_number(num)
num.insert(0, '(').insert(4, ')').insert(8, '-')
end
当我输入:
1234567894 -> (123)456-7894
这个问题很好地说明了使用正则表达式解决这类问题的好处。让我们比较使用正则表达式的方法和不使用正则表达式的方法,以获得相同级别的功能(如示例中所体现的)。
使用正则表达式
R = /
\A # match beginning of string
(\d{3}) # match 3 digits in capture group 1
(\d{3}) # match 3 digits in capture group 2
(\d{4}) # match 3 digits in capture group 3
( # begin capture group 4
\sext: # match space, string
(?:\s\d+)? # optionally match space, >= 1 digits in non-capture group
\z # match end of string
| # or
\z # match end of string
) # end capture group 4
/x # free-spacing regex definition mode
def format_phone_number(num)
return nil unless (num.strip) =~ R
ext = ( == " ext:") ? '' :
"(%s)%s-%s%s" % [, , , ext]
end
format_phone_number "9876542123 ext: 6789" #=> "(987)654-2123 ext: 6789"
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789"
format_phone_number "9876785678 ext:" #=> "(987)678-5678"
format_phone_number "9876785678" #=> "(987)678-5678"
format_phone_number "4543456" #=> nil
format_phone_number "#9876785678" #=> nil
format_phone_number "98765421234 ext: 6789" #=> nil
format_phone_number "9876542123 ext.: 6789" #=> nil
format_phone_number "9876542123 ext:6789" #=> nil
format_phone_number "9876542123 ext: 6789#" #=> nil
format_phone_number "9876542123ext: 6789" #=> nil
不要使用正则表达式
def format_phone_number(num)
str = num.strip
return nil if str.size < 10
nbr, ext = str[0,10], str[10..-1]
ext = "" if ext == " ext:"
return nil unless (Integer(nbr) rescue false)
return nil unless ext.empty? || ext[0,6] == " ext: "
return nil unless (ext.empty? || (Integer(ext[6..-1]) rescue false))
"(%s)%s-%s%s" % [num[0,3], num[3,3], num[6,4], ext]
end
format_phone_number "9876542123 ext: 6789" #=> "(987)654-2123 ext: 6789"
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789"
format_phone_number "9876785678 ext:" #=> "(987)678-5678"
format_phone_number "9876785678" #=> "(987)678-5678"
format_phone_number "4543456" #=> nil
format_phone_number "#9876785678" #=> nil
format_phone_number "98765421234 ext: 6789" #=> nil
format_phone_number "9876542123 ext.: 6789" #=> nil
format_phone_number "9876542123 ext:6789" #=> nil
format_phone_number "9876542123 ext: 6789#" #=> nil
format_phone_number "9876542123ext: 6789" #=> nil