2017-08-23 36 views

回答

2

**如果你想用一個固定數量的*符號面膜,你可以YSE

'[email protected]'.sub(/\A(..).*@.*(..)\z/, '\1****@****\2') 
# => lo****@****om 

Ruby demo

這裏,

  • \A - 串錨的開始
  • (..) - 組1:第一2個字符
  • .*@.* - 比換行符字符其他儘可能多至任何0+字符最後@後跟另一組0+字符以外的換行符
  • (..) - 組2:最後2個字符
  • \z - 字符串結尾。

在replacment字符串\1是指保持在第1組的值,\2引用組2

值。如果你想掩蓋現有的字符,同時保持它們的數量,則可能考慮一種方法來捕捉你需要保持或過程,和操作sub塊內的捕獲字符串的部分:

'[email protected]'.sub(/\A(..)(.*)@(.*)(..)\z/) { 
    $1 + "*"*$2.length + "@" + "*"*$3.length + $4 
} 
# => lo*********@*******om 

Ruby demo

詳細

  • \A - 第1組捕獲任何2個字符
  • (.*) - - 第2組捕獲任何0+字符儘可能多地到最後的字符串
  • (..)的開始。 ...
  • @ - @ char
  • (.*) - 第3組捕獲任何0+字符儘可能多至
  • (..) - 組4:最後兩個字符
  • \z - 字符串的結尾。

請注意,在塊內部,$1包含組1的值,$2包含組2的值,依此類推。

1

使用gsub與前瞻,看看隱藏的正則表達式模式:

'[email protected]'.gsub(/(?<=.{2}).*@.*(?=\S{2})/, '****@****') 
=> "lo****@****om" 

使用普通的紅寶石:

str.first(2) + '****@****' + str.last(2) 
=> "lo****@****om" 
相關問題