Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在与模式匹配的数组中组合元素?_Arrays_Ruby_String_Concatenation - Fatal编程技术网

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