【问题标题】:How to only mask middle part of Ruby string?如何只屏蔽 Ruby 字符串的中间部分?
【发布时间】:2016-12-06 05:44:08
【问题描述】:

我有这个:

phone = "+60123453180"
p = phone.gsub!(/(?=...).(?=....)/, '*')
=> "********3180"

如何只屏蔽345并返回+6012***3180

【问题讨论】:

  • 如何定义“中间”部分?
  • 你知道电话号码的长度吗?
  • @pramod 我相信是phone.length

标签: ruby regex string ruby-on-rails-4 gsub


【解决方案1】:

在原地修改phone

phone[5..7] = "***"
p phone    # => "+6012***180"

如果每个被遮挡的字符都应该有一个对应的星号,就像你的例子一样,那么明确表示它可能会更好:

range_to_cover = 5..7
phone[range_to_cover] = "*" * range_to_cover.size

【讨论】:

    【解决方案2】:

    我会从这样的开始:

    phone = '+60123453180'
    phone.sub(/(?<=\A.{4})(.*)(?=.{4}\z)/) { |match| '*' * match.length }
    #=> "+601****3180"
    

    【讨论】:

    • 这里的正则表达式是多余的。
    • 我不会听起来那么明确,但这里的前瞻确实有点矫枉过正。
    • 感谢@spickermann 的帮助。我真的很感谢你的帮助。 :)
    【解决方案3】:
    phone = "+60123453180"
    phone.tap { |p| p[5...8] = "****" }
    #⇒ "+6012****3180"
    

    使用5...8 范围来修改要替换的符号数量。

    NB您的原始代码修改了手机就地,因此上面的代码也修改了它。

    为了保持原始值不变,可以使用dup

    phone.dup.tap { |p| p[5...8] = "****" }
    #⇒ "+6012****3180"
    phone
    #⇒ "+60123453180"
    

    【讨论】:

    • 我不确定我们是否可以假设字符串总是 12 个字符长并且中间的替换是 4 个字符。如果电话号码只有 10 个字符或 14 个字符怎么办?
    • @spickermann 注意上面的“玩范围”行。没有什么能阻止我们做到s.length/3...s.length/3*2
    • 我喜欢这个解决方案。谢谢@mudasobwa!
    • 为什么使用#tap?另外,您的意思是像 OP 那样用三个星号代替四个星号吗?
    • @WayneConrad tap 是返回整数。我没有太注意要替换多少个符号,它是一个显示的模式。
    猜你喜欢
    • 2013-06-27
    • 2017-10-27
    • 2014-09-07
    • 2023-03-18
    • 2012-02-20
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多