2015-05-12 3 views

ответ

0

Вместо split тин строки, я хотел бы рассмотреть соответствие или использовать анализатор для этого.

s = "Mark Sally 'John Smith' Steve" 
p s.scan(/'([^']+)'|(\S+)/).flatten.compact 
#=> ["Mark", "Sally", "John Smith", "Steve"] 
+0

это идеально. Вы знаете, как я могу исключить одинарные кавычки или двойные кавычки? –

+0

'/ '([^'] +) '|" ([^ "] +)" | (\ S +)/' – hwnd

0

Это похоже на работу с читателем CSV - оно обрабатывает несколько слов, сгруппированных вместе кавычками.

require 'csv' 

line = "Mark Sally 'John Smith' Steve" 
line.parse_csv(:col_sep => " ", :quote_char => "'") 
puts line # ["Mark", "Sally", "John Smith", "Steve"] 
0

Я предлагаю вам scan, а не split:

r =/
    (?<=') # match a single quote in a positive lookbehind 
    .*? # match any number of any characters, lazily 
    (?=') #match a single quote in a positive lookahead 
    | # or 
    \w+ # match one or more word characters 
    /x 

"Mark Sally 'John Smith' Steve".scan(r) 
    #=> ["Mark", "Sally", "John Smith", "Steve"] 

Обратите внимание, что порядок важен здесь:

r = /\w+|(?<=').*?(?=')/ 
"Mark Sally 'John Smith' Steve".scan(r) 
    #=> ["Mark", "Sally", "John", "Smith", "Steve"]