Как получить фрагменты текста из строки в Ruby?

Если пользователь отправляет строку вроде:

Мои планы в гостиной #plans #livingroom @cbmeeks #design @moe @larry - это круто!

Я хочу иметь следующие массивы / строки:

text = "My living room plans"
tags = ['plans', 'livingroom', 'design']
people = ['cbmeeks', 'moe', 'larry']
description = "this is cool!"

Каждая отправленная строка будет начинаться с text кусок. нет @, -и т.д. Мне не нужно беспокоиться о пользователе, начинающем с тега или человека. Разбивка должна выглядеть примерно так, в любом порядке, кроме ТЕКСТ всегда первым.

TEXT [-description] [#tags] [@people]

РЕДАКТИРОВАТЬ Я не могу понять, как правильно их схватить. Например:

a = "My living room plans #plans #livingroom @cbmeeks #design @moe @larry -this is cool!"

/#\w+/.match(a).to_a
#=> ["#plans"] -- only grabs first one

3 ответа

Решение

Это автоматически удалит #, @, -и будет соответствовать в любом порядке:

string = "My living room plans #plans #livingroom @cbmeeks #design @moe @larry -this is cool!"
text = string[/^(.*?)+(?=\s[@#-])/]
tags = string.scan /(?<=#)\w+/
people = string.scan /(?<=@)\w+/
description = string[/(?<=-)(.*?)+?(?=($|\s[@#]))/]
input = "My living room plans #plans #livingroom @cbmeeks #design @moe @larry -this is cool!"
text = input.match('^(.*?)#')[1]
tags = input.scan(/#(.*?) /)
people = input.scan(/@(.*?) /)
description = input.match('-(.*?)$')[1]
str = 'My living room plans #plans #livingroom @cbmeeks #design @moe @larry -this is cool!'

text = str[/^([^#\@]+)/, 1].strip # => "My living room plans"
str.sub!(text, '') # => " #plans #livingroom @cbmeeks #design @moe @larry -this is cool!"

tags        = str.scan( /#([a-z0-9]+)/ ).flatten # => ["plans", "livingroom", "design"]
people      = str.scan( /@([a-z0-9]+)/ ).flatten # => ["cbmeeks", "moe", "larry"]
description = str.scan( /-(.+)/        ).flatten # => ["this is cool!"]
Другие вопросы по тегам