[英]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.