繁体   English   中英

如何在与模式匹配的数组中组合元素?

[英]How do I combine elements in an array matching a pattern?

我有一个字符串数组

["123", "a", "cc", "dddd", "mi hello", "33"]

我想加入一个以字母开头,至少两个字符且不包含空格的连续元素。 将逻辑应用于上面将产生

["123", "a", "cc dddd", "mi hello", "33"]

同样,如果我的数组是

["mmm", "3ss", "foo", "bar", "foo", "55"]

我希望结果是

["mm", "3ss", "foo bar foo", "55"]

我该怎么做?

有很多解决方法。 红宝石是一种富有表现力的语言。 显示到目前为止您已经尝试过的内容对您来说将是最有益的,这样我们可以帮助您调试/修复/改进您的尝试。

例如,这是我想到的一种可能的实现:

def combine_words(array)
  array
    .chunk {|string| string.match?(/\A[a-z][a-z0-9]+\z/i) }
    .flat_map {|concat, strings| concat ? strings.join(' ') : strings}
end

combine_words(["aa", "b", "cde", "f1g", "hi", "2j", "l3m", "op", "q r"])
  # => ["aa", "b", "cde f1g hi", "2j", "l3m op", "q r"]

请注意,我不清楚确切如何解释您的要求:

以字母开头,至少两个字符且不包含空格

字符串可以包含标点符号吗? 强调? utf-8个字符? 我把它的意思是“仅az,AZ或0-9”,但是您可能要对此进行调整。

您的要求的字面解释可能是: /\\A[[:alpha:]][^ ]+\\z/ ,但是我怀疑那不是您的意思。

说明:

  • Enumerable#chunk将遍历数组,并通过块的响应值收集条件。 在这种情况下,它将找到与所需正则表达式匹配/不匹配的顺序元素。
  • String#match? 检查字符串是否与模式匹配,并返回布尔响应。 请注意,如果您使用的是ruby v2.3或更低版本,则需要一些变通方法,例如!!string.match ,以强制布尔响应。
  • 然后, Enumerable#flat_map循环遍历每个“结果”,并在必要时连接字符串,并对结果进行展平,以避免返回任何嵌套数组。

这是另一个类似的解决方案:

def word?(string)
  string.match?(/\A[a-z][a-z0-9]+\z/i)
end

def combine_words(array)
  array
    .chunk_while {|x, y| word?(x) && word?(y)}
    .map {|group| group.join(' ')}
end

或者,这是一个更具“低技术含量”的解决方案-仅使用更多基本语言功能。 (我在这里重复使用相同的word?方法):

def combine_words(array)
  previous_was_word = false
  result = []
  array.each do |string|
    if previous_was_word && word?(string)
      result.last << " #{string}"
    else
      result << string
    end
    previous_was_word = word?(string)
  end
  result
end

您可以使用Enumerable#chunk

def chunk_it(arr)    
  arr.chunk { |s|
    (s.size > 1) && (s[0].match?(/\p{Alpha}/)) && !s.include?(' ')}.
      flat_map { |tf,a| tf ? a.join(' ') : a }
end

chunk_it(["123", "a", "cc", "dddd", "mi hello", "33"])
  #=> ["123", "a", "cc dddd", "mi hello", "33"]
chunk_it ["mmm", "3ss", "foo", "bar", "foo", "55"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM