有没有办法用gsub替换字符串中的一系列字符?

时间:2015-04-19 21:01:29

标签: ruby regex

我想用"#"替换掉除了最后4个字符之外的所有字符...就像你在信用卡对帐单上看到的那样。我已经完成了这个使用Array#each方法迭代索引[0 ..- 4]然后另一个for [-4 ..- 1]并将两者的结果铲入一个新字符串。我想,也许用正则表达式做得更好?但我是regex的新手,谷歌还没有找到任何我可以用来替换整个范围而不会丢失字符串长度的东西。我试过了

str.gsub(str[0..-5],'#')

(以及其他一些事情)但它用一个字符替换整个范围。如何使用正则表达式完成目标?

1 个答案:

答案 0 :(得分:6)

是的,这可以使用正则表达式。

> "12345678".gsub(/.(?=.{4})/, "#")
=> "####5678"
> "12345678901234".gsub(/.(?=.{4})/, "#")
=> "##########1234"

<强>解释

.(?=.{4})仅在字符后跟至少四个字符时匹配。所以它匹配除了最后四个字符之外的所有字符,因为从最后一个,第四个字符后跟3个字符而不是4.所以它无法匹配最后一个的第四个字符。同样地,对于第3,第2,第1个字符(来自最后)。

> "12345678901234".gsub(/(?!.{1,4}$)./, "#")
=> "##########1234"

DEMO