我正在使用某些用户的生产数据来进行测试和开发。所以基本上我想转换看起来像
的数据 Mohan
至Mxxxx
或Sujeet
至Sxxxxx
我用过的东西:
2.0.0-p594 :053 > a = "Mohini".split("")
=> ["M", "o", "h", "i", "n", "i"]
2.0.0-p594 :054 > x = a.shift
=> "M"
2.0.0-p594 :055 > x+a.join().gsub(/\w/, "x")
=> "Mxxxxx"
似乎对我来说很好,但有一种更优雅的方式,而不是分裂和加入。
答案 0 :(得分:4)
使用以下正则表达式并将匹配的字符替换为x
(?<=.).
点.
是正则表达式中的一个特殊元字符,可以匹配任何字符。 Positive Lookbehind断言匹配必须以与lookbehind内部模式匹配的字符开头。在我们的例子中,上面的正则表达式匹配所有以字符开头的字符。因此它匹配除第一个字符之外的所有字符,因为它没有在第一个字符之前存在字符。
> "Sujeet".gsub(/(?<=.)./, "x")
=> "Sxxxxx"
> "Mohan".gsub(/(?<=.)./, "x")
=> "Mxxxx"
将Mohan Kumar Singh
更改为Mxxxx Kxxxx Sxxxx
> "Mohan Kumar Singh".gsub(/[a-z]/, "x")
=> "Mxxxx Kxxxx Sxxxx"
> "Mohan Kumar Singh".gsub(/[^A-Z\s]/, "x")
=> "Mxxxx Kxxxx Sxxxx"
> "Mohan Kumar Singh".gsub(/\B./, "x")
=> "Mxxxx Kxxxx Sxxxx"
将Mohan Kumar Singh
更改为Mxxxx xxxxx xxxxx
> "Mohan Kumar Singh".gsub(/(?<=.)\S/, "x")
=> "Mxxxx xxxxx xxxxx"
\S
匹配非空格字符。
答案 1 :(得分:1)
不是很优雅,但更简单:
name = "Mohan"
name[0, 1] + "x"*(name.size-1)
#=> "Mxxxx"
如果名称包含全名,它仍然可以通过这种方式完成,但它不会那么漂亮:
name = "Sujeet Singh"
name.split.collect {|n| n[0, 1] + "x"*(n.size-1)}.join(' ')
#=> "Sxxxxx Sxxxx"
或
name = "Mohan Kumar Singh"
name.split.collect {|n| n[0, 1] + "x"*(n.size-1)}.join(' ')
=> "Mxxxx Kxxxx Sxxxx"