这是非常基本的,但我不知道怎么做,除非我在地图中使用数组,这是蹩脚的。
我需要得到这个:
"T--- is my d-- b-- n-- y---"
如果有两个字符我需要跳过它,不要处理它但仍保留它。如果我使用next
,我会收到零。
str = "This is my day but not your"
str.split.map{ |word| word[0] + word[1..-1].gsub(/./,"-")} * " " #=> T--- i- m- d-- b-- n-- y---
这是我的第二个解决方案,我不喜欢,但它确实有效,我相信有更优雅的解决方案:
arr = Array.new
str.split.map{ |word|
arr << word if word.length < 3
arr << word[0] + word[1..-1].gsub(/./,"-")} * " "
puts arr.join(" ")
答案 0 :(得分:0)
当您不想做任何事情时,只需对案例进行身份映射。
str.split.map{ |word|
if word.length == 2
word
else
word[0] + word[1..-1].gsub(/./,"-")
end
} * " "
如果您需要单行:
str.split.map{ |word| word.length == 2 ? word : word[0] + word[1..-1].gsub(/./,"-")} * " "
答案 1 :(得分:0)
我会这样做:
str = "This is my day but not your"
ary = str.split.map{ |s|
if s.size != 2
s[0] + '-' * (s.size - 1)
else
s
end
}
以下是ary
的样子:
ary
# => ["T---", "is", "my", "d--", "b--", "n--", "y---"]
join
数组重新创建一个字符串:
ary.join(' ')
# => "T--- is my d-- b-- n-- y---"
如果一个单词是一个字符,例如“a”或“I”,会发生什么?
如果单词是单个字符,则不会被替换,我不希望它被删除。
str = "This is my day but not your a"
ary = str.split.map{ |s|
if s.size > 2
s[0] + '-' * (s.size - 1)
else
s
end
}
ary
# => ["T---", "is", "my", "d--", "b--", "n--", "y---", "a"]
ary.join(' ')
# => "T--- is my d-- b-- n-- y--- a"
答案 2 :(得分:0)
您可以在字符串上使用带有gsub
的更具体的正则表达式,以便您只处理三个字符或更长的字词。
str.gsub(/\w{3,}/) do |word|
word[0]<<word[1..-1].gsub(/./,'-')}
end
在外部gsub
,\w
指的是任何&#34;字&#34;字符(主要是字母和数字)。 {3,}
表示重复至少3次。在块中,我们执行另一个gsub来处理单个单词。
您可以使用带有lookbehind和lookahead的复杂正则表达式在单个gsub
中执行此操作,但这看起来有点矫枉过正。
答案 3 :(得分:0)
你的问题不清楚你的替换规则是什么,但是假设你的规则是:
使用这些规则,您可以使用以下代码执行此操作:
str = 'This is my day but not yours'
str.split.map do |word|
underscores = ?_ * (word.size - 1)
word.size < 3 ? word : word.gsub(/\A.\K.*/, underscores)
end.join " "
#=> "T___ is my d__ b__ n__ y____"
肯定有不止一种方法可以做到这一点,但这种方式对我来说似乎既可读又可扩展。您的里程可能会有所不同。