如果条件为真,则映射不会进行处理

时间:2014-11-20 01:35:57

标签: ruby

这是非常基本的,但我不知道怎么做,除非我在地图中使用数组,这是蹩脚的。

我需要得到这个:

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

4 个答案:

答案 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)

你的问题不清楚你的替换规则是什么,但是假设你的规则是:

  1. 打印任何带有两个或更少字母的单词而不进行修改。
  2. 用下划线替换除剩余单词的第一个字母以外的所有字符。
  3. 使用这些规则,您可以使用以下代码执行此操作:

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

    肯定有不止一种方法可以做到这一点,但这种方式对我来说似乎既可读又可扩展。您的里程可能会有所不同。