De识别生产数据

时间:2014-12-22 07:49:25

标签: ruby regex string

我正在使用某些用户的生产数据来进行测试和开发。所以基本上我想转换看起来像

的数据

MohanMxxxx

SujeetSxxxxx

我用过的东西:

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" 

似乎对我来说很好,但有一种更优雅的方式,而不是分裂和加入。

2 个答案:

答案 0 :(得分:4)

使用以下正则表达式并将匹配的字符替换为x

(?<=.).

.是正则表达式中的一个特殊元字符,可以匹配任何字符。 Positive Lookbehind断言匹配必须以与lookbehind内部模式匹配的字符开头。在我们的例子中,上面的正则表达式匹配所有以字符开头的字符。因此它匹配除第一个字符之外的所有字符,因为它没有在第一个字符之前存在字符。

DEMO

> "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"