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

Howard からの以前の回答を拡張するために、次のメソッドを追加できます。

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 に答える