12

我正在尝试将字符串拆分为这样Presentation about "Test Driven Development"的数组:

[ 'Presentation',
  'about',
  '"Behavior Driven Development"' ]

我已经尝试过CSV::parse_line(string, col_sep: ' '),但这会导致

[ 'Presentation',
  'about',
  'Behavior Driven Development' ] # I'm missing the quotes here

我也尝试了一些正则表达式魔法,但我仍然是初学者并且没有成功。我想这对于专业人士来说很简单,所以也许有人可以指出我正确的方向?谢谢。

4

3 回答 3

22

您可以使用以下正则表达式split

str = 'Presentation about "Test Driven Development"'
p str.split(/\s(?=(?:[^"]|"[^"]*")*$)/)
# => ["Presentation", "about", "\"Test Driven Development\""]

如果有空格,则它会拆分,但前提是直到末尾的文本包含偶数个". 请注意,此版本仅在正确引用所有字符串时才有效。

另一种解决方案用于scan读取字符串的各个部分(除了空格):

p str.scan(/(?:\w|"[^"]*")+/)
# => ["Presentation", "about", "\"Test Driven Development\""]
于 2012-07-19T17:33:50.897 回答
4

只是为了扩展霍华德先前的答案,您可以添加此方法:

class String
  def tokenize
    self.
      split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
      select {|s| not s.empty? }.
      map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
  end
end

结果:

> 'Presentation      about "Test Driven Development"  '.tokenize
=> ["Presentation", "about", "Test Driven Development"]
于 2015-01-02T12:19:39.810 回答
0

这里:

"Presentation about \"Test Driven Development\"".scan(/\s?\w+\s?|"[\w\s]*"/).map {|s| s.strip}
于 2012-07-19T17:26:28.083 回答