首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有Ruby方法来替代字符串的最后四位数,不包括空格?

有没有Ruby方法来替代字符串的最后四位数,不包括空格?
EN

Stack Overflow用户
提问于 2020-01-19 16:08:03
回答 3查看 410关注 0票数 0

我得找个办法把最后四个数字字符匿名。提供一个电话号码字符串,如"+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",但是

代码语言:javascript
复制
phoneNumber.gsub(/\d.{4}$/, "X")

输出"+36 6 41 88 X",我希望我的代码输出"+36 6 41 88 XX“。

我还尝试了以下繁琐的解决方案:

代码语言:javascript
复制
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")

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-19 18:54:52

如果您的字符串只包含以' dd‘结尾的电话号码,其中d是一个数字,则不需要正则表达式:

代码语言:javascript
复制
'+36 6 41 88 75 22'[0..-6] + 'XX XX'
  #=> "+36 6 41 88 XX XX" 

然而,我假设,对“最后四个数字字符”的更有趣的解释是,连续的数字对可以被零或更多的非数字分隔。在这种情况下,下面是进行所需替换的简单方法。

代码语言:javascript
复制
def sub_last4(str)
  n = str.count('0-9')
  str.gsub(/\d/) { |s| (n -= 1) <= 3 ? 'X' : s }
end

代码语言:javascript
复制
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"

这是第二条路。

代码语言:javascript
复制
def sub_last4(str)
  4.times.each_with_object(str.dup) { |_,s|
    s[s.rindex(/\d/)] = 'X' }
end
票数 0
EN

Stack Overflow用户

发布于 2020-01-19 16:12:00

你可以用

代码语言:javascript
复制
phoneNumber = phoneNumber.gsub(/\d(?=(?:\D*\d){0,3}\D*\z)/, 'X')

请参阅regex演示在线Ruby演示

详细信息

  • \d -一个数字.
  • (?=(?:\D*\d){0,3}\D*\z) -紧随其后的是
    • (?:\D*\d){0,3} -0到3次连续发生的
      • \D* - 0+非数字字符
      • \d -一个数字

代码语言:javascript
复制
- `\D*` - 0+ non-digit chars
- `\z` - end of string (`$` matches end of a line in a Ruby regex).

另一个想法是:将最后四个数字与数字以外的任何字符匹配,然后用X替换这些数字。

代码语言:javascript
复制
phoneNumber.gsub(/(?:\d\D*){4}\z/) { $~[0].gsub(/\d/, 'X') }

请参阅这个Ruby演示

在这里,(?:\d\D*){4}\z匹配字符串末尾连续出现的一个数字和任何0+非数字字符,而gsub块中的$~[0]表示整个匹配值,其中.gsub(/\d/, 'X')X替换每个数字。

票数 4
EN

Stack Overflow用户

发布于 2020-01-20 13:10:55

您可以反转字符串,然后用'X'替换单个数字四次。

代码语言:javascript
复制
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'

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59811865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档