Arrays 如何在与模式匹配的数组中组合元素?
我有一个字符串数组Arrays 如何在与模式匹配的数组中组合元素?,arrays,ruby,string,concatenation,Arrays,Ruby,String,Concatenation,我有一个字符串数组 ["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"] 如何进行此操
["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"]
如何进行此操作?解决此问题的方法有很多;ruby是一种高度表达性的语言。展示您迄今为止所做的尝试对您最为有益,这样我们可以帮助调试/修复/改进您的尝试 例如,我提出了一个可能的实现:
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字符?我认为它的意思是“只有a-z,a-z或0-9”,但你可能想调整一下
对您的需求的字面解释可以是:/\A[[:alpha:][^]+\z/
,但我怀疑这不是您的意思
说明:
- 将遍历数组并按块的响应值收集项。在这种情况下,它将查找与所需正则表达式匹配/不匹配的顺序元素
- 检查字符串是否与模式匹配,并返回布尔响应。请注意,如果您使用的是ruby
或更低版本,则需要一些变通方法,例如v2.3
,强制执行布尔响应!!string.match
- 然后循环遍历每个“结果”,必要时连接字符串,并展平结果以避免返回任何嵌套数组
下面是另一个类似的解决方案:
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组合词(数组)
上一个单词为false
结果=[]
array.each do|字符串|
如果上一个单词是单词(&&word)(字符串)
result.last您可以使用
到目前为止你试过什么?你犯了什么错误?
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
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"]