我得找个办法把最后四个数字字符匿名。提供一个电话号码字符串,如"+36 6 41 88 75 22“(或任何其他格式,如"+36641887522”或+36 6 418 875 22等等),我希望我的代码输出"+36 6 41 88 XX“。
phoneNumber = "+36 6 41 88 75 22"我找到的最接近我想要的选择的正则表达式是:/\d.{4}$/,它非常方便,因为lastFour = phone.scan(/\d.{4}$/).join等于“7522”,包括空格。
现在我想替换所有的数字(而不是空格!)用"X",但是
phoneNumber.gsub(/\d.{4}$/, "X")输出"+36 6 41 88 X",我希望我的代码输出"+36 6 41 88 XX“。
我还尝试了以下繁琐的解决方案:
phoneNumber = "+36 6 41 88 75 22"
def anonymizer(phone)
lastFour = phone.scan(/\d.{4}$/).join
anonFour = lastFour.chars
anonFour.each do |digit|
digit.gsub(/[0-9]/, "X")
end
puts "attempted transform #{anonFour}"
phone.gsub(lastFour, anonFour.join)
end
phoneyNumber = anonymizer(phoneNumber)
puts phoneyNumber 无效,因为它返回的号码是("+36 6 41 88 75 22“,而不是"+36 6 41 88 XX")
发布于 2020-01-19 18:54:52
如果您的字符串只包含以' dd‘结尾的电话号码,其中d是一个数字,则不需要正则表达式:
'+36 6 41 88 75 22'[0..-6] + 'XX XX'
#=> "+36 6 41 88 XX XX" 然而,我假设,对“最后四个数字字符”的更有趣的解释是,连续的数字对可以被零或更多的非数字分隔。在这种情况下,下面是进行所需替换的简单方法。
def sub_last4(str)
n = str.count('0-9')
str.gsub(/\d/) { |s| (n -= 1) <= 3 ? 'X' : s }
end
sub_last4 '+36 6 41 88 75 22'
#=> "+36 6 41 88 XX XX"
sub_last4 '+36 6 41 88 7522'
#=> "+36 6 41 88 XXXX"
sub_last4 '+36 6 how 41 8 now 8 75 2 brown 5 cow'
#=> "+36 6 how 41 8 now 8 XX X brown X cow"
sub_last4 'SY-0-6447'
#=> "SY-0-XXXX"这是第二条路。
def sub_last4(str)
4.times.each_with_object(str.dup) { |_,s|
s[s.rindex(/\d/)] = 'X' }
end发布于 2020-01-19 16:12:00
你可以用
phoneNumber = phoneNumber.gsub(/\d(?=(?:\D*\d){0,3}\D*\z)/, 'X')详细信息
\d -一个数字.(?=(?:\D*\d){0,3}\D*\z) -紧随其后的是(?:\D*\d){0,3} -0到3次连续发生的\D* - 0+非数字字符\d -一个数字
- `\D*` - 0+ non-digit chars
- `\z` - end of string (`$` matches end of a line in a Ruby regex).
另一个想法是:将最后四个数字与数字以外的任何字符匹配,然后用X替换这些数字。
phoneNumber.gsub(/(?:\d\D*){4}\z/) { $~[0].gsub(/\d/, 'X') }请参阅这个Ruby演示
在这里,(?:\d\D*){4}\z匹配字符串末尾连续出现的一个数字和任何0+非数字字符,而gsub块中的$~[0]表示整个匹配值,其中.gsub(/\d/, 'X')用X替换每个数字。
发布于 2020-01-20 13:10:55
您可以反转字符串,然后用'X'替换单个数字四次。
phone_number = '+36 6 41 88 75 22'
phone_number.reverse!
4.times { phone_number.sub!(/\d/, 'X') }
phone_number.reverse!
phone_number
#=> "+36 6 41 88 XX XX"请注意,这里使用的是变异方法,如果您不想将原来的phone_number.reverse!替换为phone_number = phone_number.reverse。它将创建一个由其他变异方法安全操作的新字符串。
您可以根据偏好将phone_number.sub!(/\d/, 'X')替换为phone_number[/\d/] = 'X'。
https://stackoverflow.com/questions/59811865
复制相似问题