【问题标题】:Ruby - Substituting whitespace in all array elements with every non-whitespace characterRuby - 用每个非空白字符替换所有数组元素中的空白
【发布时间】:2014-08-11 15:38:34
【问题描述】:

我 99% 确定以前没有人问过这个问题,所以就这样吧。

假设我们有一个字符串数组

strings = ['first string', 'second string', 'third string']

我想创建一个新的大型数组,在其中将三个元素中的每个元素中的 空白字符 替换为每个非空白字符(字母、数字、符号)。

它看起来像这样。

new_array = ['firstastring', 'secondastring', 'thirdastring', 'firstbstring', .. 
'first1string', 'seond1string', .. 'third^string', ...]

新数组的计数应该是原数组中的元素个数(3)乘以Ruby中非空白字符的个数

一个可能的解决方案是这样的

new_array = []
/[\S]/.each do |character|
  strings.each do |string|
    new_array.gsub(string, character)
  end
end

我理解在正则表达式中 \S 表达式指的是任何非空白字符,所以我认为这是最好的使用方法。

我仍然是 Ruby 的初学者,所以我很感激任何帮助。

根据我对 Ruby 的理解,该解决方案很可能涉及每个循环。

更新 抱歉各位,您好像不能在 regex 类上调用 each 方法。我有另一个想法。

characters_array = (0..9).to_a.map(&:to_s) + ('a'..'z').to_a + ('A'..'Z').to_a + 
["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", "`", "~", 
":", ";", ",", ".", "?", "/"]

new_array = []
characters_array.each do |character|
  strings.each do |string|
    new_array.gsub(string, character)
  end
end

这只是一个想法。

【问题讨论】:

  • 我认为你误解了正则表达式。您不能在/[\S]/ 上致电each。正则表达式用于在文本中搜索和替换,而不是用于描述数据集。通过遍历数组和非空白字符数组,可以很容易地实现您想要做的事情。但是,我不知道在哪里可以获得包含所有非空白字符的数组。对于所有字母,您都可以使用('a'..'z').to_a,但我猜这还不够。
  • 谢谢,我会更新帖子,我有另一个想法
  • 您希望使用的非空白字符集是什么?是否要包含所有 Unicode 字符?您的第一步是仔细定义该字符集是什么。然后用那组字符来代替。
  • 我认为所有非空白字符都只是数字、字母和符号。我刚才用这些字符创建了一个数组。
  • @DarkMouse,我很好奇你的用例。最肯定的是,有一个替代解决方案不需要您创建一个 99+% 冗余的阵列。愿意提供一些背景信息吗?

标签: ruby arrays regex string gsub


【解决方案1】:

你可以这样做:

strings = ['first string', 'second string', 'third str ing']
subs = %w[0 a ^]
  #=> ["0", "a", "^"]

strings.product(subs).map { |e,c| e.gsub(/\s/,c) }
  #=> ["first0string", "firstastring", "first^string",
  #    "second0string", "secondastring", "second^string",
  #    "third0str0ing", "thirdastraing", "third^str^ing"]

subs.product(strings).map { |c,e| e.gsub(/\s/,c) }
 #=> ["first0string", "second0string", "third0str0ing",
 #   "firstastring", "secondastring", "thirdastraing",
 #   "first^string", "second^string", "third^str^ing"]

取决于您喜欢的顺序。

【讨论】:

  • 嗨,Cary,我认为您的输出有误。在第三个字符串修改中,您替换了两次(包括一次用非空白字符替换。除此之外,它看起来很完美
  • 黑暗,这是故意的。 :-) 如您所见,我在您的数组strings 中的"third string" 中插入了一个额外的空格。那是为了展示那会产生什么效果。
  • 我明白了,那是我的错。我没有注意到你的字符串数组。
【解决方案2】:

您可以使用mapflat_map 获取数组:

new_array = characters_array.flat_map do |character|
  strings.map do |string|
    string.gsub(' ', character)
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多