首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分由子字符串列表分隔的字符串

拆分由子字符串列表分隔的字符串
EN

Stack Overflow用户
提问于 2019-02-06 17:59:36
回答 4查看 84关注 0票数 1

我有这样的数据:

代码语言:javascript
复制
str = "CODEA text for first item CODEB text for next item CODEB2 some"\
"more text CODEC yet more text"

还有一份清单:

代码语言:javascript
复制
arr = ["CODEA", "CODEB", "CODEB2", "CODEC", ... ]

我想把这个字符串分成一个散列。散列的键将是CODEACODEB等。哈希值将是后面的文本,直到下一段代码。输出应该如下所示:

代码语言:javascript
复制
"CODEA" => "text for first item",
"CODEB" => "text for next item",
"CODEB2" => "some more text",
"CODEC" => "yet more text"
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-06 18:59:41

我们得到了一个刺和一个数组。

代码语言:javascript
复制
str = "CODEA text for first item CODEB text for next item " + 
      "CODEB2 some more text CODEC yet more text"

arr= %w|CODEC CODEB2 CODEA CODEB|
  #=> ["CODEC", "CODEB2", "CODEA", "CODEB"]     

这是获取所需哈希的一种方法。

代码语言:javascript
复制
 str.split.
     slice_before { |word| arr.include?(word) }.
     map { |word, *rest| [word, rest.join(' ')] }.
     to_h
  #=> {"CODEA" =>"text for first item",
  #    "CODEB" =>"text for next item",
  #    "CODEB2"=>"some more text",
  #    "CODEC" =>"yet more text"}

在此之前

步骤如下。

代码语言:javascript
复制
a = str.split
  #=> ["CODEA", "text", "for", "first", "item", "CODEB",
  #    "text", "for", "next", "item", "CODEB2", "some",
  #    "more", "text", "CODEC", "yet", "more", "text"] 
b = a.slice_before { |word| arr.include?(word) }
  #=> #<Enumerator:
  #     #<Enumerator::Generator:0x00005cbdec2b5eb0>:each> 

我们可以看到(4)元素(数组),这些元素将由此枚举器生成,并通过将其转换为数组传递给each_with_object

代码语言:javascript
复制
b.to_a
  #=> [["CODEA", "text", "for", "first", "item"],
  #    ["CODEB", "text", "for", "next", "item"],
  #    ["CODEB2", "some", "more", "text"],
  #    ["CODEC", "yet", "more", "text"]] 

还在继续

代码语言:javascript
复制
c = b.map { |word, *rest| [word, rest.join(' ')] }
  #=> [["CODEA", ["text for first item"]],
  #    ["CODEB", ["text for next item"]],
  #    ["CODEB2", ["some more text"]],
  #    ["CODEC", ["yet more text"]]] 
c.to_h
  #=> {"CODEA"=>"text for first item",
  #    "CODEB"=>"text for next item",
  #    "CODEB2"=>"some more text",
  #    "CODEC"=>"yet more text"} 

以下可能是一种更好的方法。

代码语言:javascript
复制
 str.split.
     slice_before { |word| arr.include?(word) }.
     each_with_object({}) { |(word, *rest),h|
       h[word] = rest.join(' ') }

当我还是个孩子的时候,这件事可能是这样做的。

代码语言:javascript
复制
last_word = ''
str.split.each_with_object({}) do |word,h|
  if arr.include?(word)
    h[word]=''
    last_word = word
  else
    h[last_word] << ' ' unless h[last_word].empty?
    h[last_word] << word
  end     
end

必须将last_word设置为块之外的任何内容。

票数 3
EN

Stack Overflow用户

发布于 2019-02-06 20:07:10

代码:

代码语言:javascript
复制
str = 'CODEA text for first item CODEB text for next item ' + 
      'CODEB2 some more text CODEC yet more text'

puts Hash[str.scan(/(CODE\S*) (.*?(?= CODE|$))/)]

结果:

代码语言:javascript
复制
{"CODEA"=>"text for first item", "CODEB"=>"text for next item", "CODEB2"=>"some more text", "CODEC"=>"yet more text"}
票数 3
EN

Stack Overflow用户

发布于 2019-02-06 19:14:32

另一种选择。

代码语言:javascript
复制
string.split.reverse
      .slice_when { |word| word.start_with? 'CODE' }
      .map{ |(*v, k)| [k, v.reverse.join(' ')] }.to_h

Enumerator#slice_when,在本例中返回以下数组:

代码语言:javascript
复制
[["text", "more", "yet", "CODEC"], ["text", "more", "some", "CODEB2"], ["item", "next", "for", "text", "CODEB"], ["item", "first", "for", "text", "CODEA"]]

然后映射数组以生成所需的哈希以获得结果(我没有反转哈希):

代码语言:javascript
复制
#=> {"CODEC"=>"yet more text", "CODEB2"=>"some more text", "CODEB"=>"text for next item", "CODEA"=>"text for first item"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54559850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档