Я пытаюсь выяснить, как лучше разобрать строки текста, которые имеют значение, которые выглядят следующим образом:Разбор Линии отдельных слов и групп слов в кавычках с помощью регулярных выражений в Ruby,
line1
'Line two' fudgy whale 'rolly polly'
fudgy 'line three' whale
fudgy whale 'line four'
'line five' 'fish heads'
line six
Я хочу использовать одно регулярное выражение, чтобы отобразить желаемый результат. Я уже знаю, как убить его, чтобы получить желаемый результат, но Я хочу одно выражение.
Желаемая выход:
["line1"]
["Line two", "fudgy", "whale", "rolly polly"]
["fudgy", "line three", "whale"]
["fudgy", "whale", "line four"]
["line five", "fish heads"]
["line", "six"]
Показание линии уже обрабатывается для меня через огурец. Каждая строка считывается как одно строковое значение, и я хочу разобрать отдельные слова и любое количество слов, содержащихся в одинарных кавычках. Я знаю меньше, чем ничего о регулярных выражениях, но я скопировал регулярное выражение, используя регулярное выражение «или» operator («|»), которое закрыло меня.
Принимая, что регулярное выражение я сначала пытался разбора каждой строки с использованием строки раскол:
text_line.split(/(\w+)|'(.*?)'/)
который привел к следующему, менее чем приемлемые, массивы:
["", "line1"]
["", "Line two", " ", "fudgy", " ", "whale", " ", "rolly polly"]
["", "fudgy", " ", "line three", " ", "whale"]
["", "fudgy", " ", "whale", " ", "line four"]
["", "line five", " ", "fish heads"]
["", "line", "", "six"]
Затем я попытался с помощью сканирования вместо и я увидел это:
text_line.scan(/(\w+)|'(.*?)'/)
[["line1", nil]]
[[nil, "Line two"], ["fudgy", nil], ["whale", nil], [nil, "rolly polly"]]
[["fudgy", nil], [nil, "line three"], ["whale", nil]]
[["fudgy", nil,], ["whale", nil], [nil, "line four"]]
[[nil, "line five"], [nil, "fish heads"]]
[["line", nil], [nil, "six",]]
Так что я мог видеть регулярное выражение "или" оператора создавала ценность для каждой возможной «или» позиции, которая имела смысл. Зная, что я понял, я мог бы использовать сканирование, сглаживаются, и компактен, чтобы очистить его дать мне желаемый результат:
text_line.scan(/(\w+)|'(.*?)'/).flatten.compact
["line1"]
["Line two", "fudgy", "whale", "rolly polly"]
["fudgy", "line three", "whale"]
["fudgy", "whale", "line four"]
["line five", "fish heads"]
["line", "six"]
Но с помощью сканирования, сглаживаются, и компактный выглядит невероятно уродливый и кажется, что я «Просто обезьяна исправляет мое собственное плохое регулярное выражение. Я думаю вместо того, чтобы ham-handedly фиксировать неаккуратный вывод из моего плохо сконструированного регулярного выражения, я должен просто написать лучшее регулярное выражение.
Итак, Можно ли использовать одно регулярное выражение для синтаксического анализа вышеуказанных строк и получения желаемого результата? Я могу начать с регулярного выражения, но я думаю, могу ли я как-то сгруппировать их или так, чтобы они возвращали только одно значение для каждой группы, что, вероятно, было бы тем, что я ищу.
Пожалуйста, не стесняйтесь предлагать альтернативные решения, но Я ищу элегантные решения, выполненные Ruby way, так как я пытаюсь научить себя, как использовать язык.
Заранее благодарим за ваше время.
отредактированный включать tininfi более лучшее, более точное регулярное выражение
О, это слишком долго, чтобы прочитать все ваши описания, не могли бы вы сделать это проще? Вы хотите извлекать все * слова, содержащиеся в одинарных кавычках * в каждой строке? – Vantomex
Или просто произнесите слова «желаемый результат» полужирный – Nakilon
Если я был слишком многословным, извиняюсь. Я уже заявил в своем тексте, что мой желаемый результат, но скопировал его на верх, чтобы сделать его более понятным. Причина, по которой я этого не делал, заключалась в том, что я хотел, чтобы люди помогали читать то, что я уже пробовал, поэтому они не тратят время на повторение этого. Кроме того, поскольку я описываю, что я ищу в конце вопроса, если вы не прочитаете весь вопрос, вы не поймете, о чем я прошу. – 2010-10-13 19:27:31