Как получить фрагменты текста из строки в 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!"]