从字符串中删除哈希标记,然后将哈希标记词连接在另一个以逗号分隔的字符串中,这是一种好方法:
'Some interesting tweet #hash #tags'
结果将是:
'Some interesting tweet'
和
'hash,tags'
答案 0 :(得分:7)
str = 'Some interesting tweet #hash #tags'
a,b = str.split.partition{|e| e.start_with?("#")}
# => [["#hash", "#tags"], ["Some", "interesting", "tweet"]]
a
# => ["#hash", "#tags"]
b
# => ["Some", "interesting", "tweet"]
a.join(",").delete("#")
# => "hash,tags"
b.join(" ")
# => "Some interesting tweet"
答案 1 :(得分:2)
备用路径是使用scan
然后删除哈希标记:
tweet = 'Some interesting tweet #hash #tags'
tags = tweet.scan(/#\w+/).uniq
tweet = tweet.gsub(/(?:#{ Regexp.union(tags).source })\b/, '').strip.squeeze(' ') # => "Some interesting tweet"
tags.join(',').tr('#', '') # => "hash,tags"
解剖它显示:
tweet.scan(/#\w+/)
返回一个数组["#hash", "#tags"]
。uniq
会删除所有重复的标记。Regexp.union(tags)
返回(?-mix:\#hash|\#tags)
。Regexp.union(tags).source
返回\#hash|\#tags
。我们一开始并不想要模式标记,因此使用source
修复了这一点。/(?:#{ Regexp.union(tags).source })\b/
返回正则表达式/(?:\#hash|\#tags)\b/
。tr
是将一个或多个字符翻译成另一个字符或剥离它们的极快方法。最终的正则表达式不是可以生成的最优化的。我实际上编写代码来生成:
/#(?:hash|tags)\b/
但如何做到这一点留给你锻炼。并且,对于短弦乐而言,就速度而言,它不会产生太大的影响。
答案 2 :(得分:0)
这有一个以空白开头的哈希数组 然后它根据空格分割哈希标记 然后它会查找哈希标记并抓取其余部分 然后它将它存储到数组
中array_of_hashetags = []
array_of_words = []
str = "Some interesting tweet #hash #tags"
str.split.each do |x|
if /\#\w+/ =~ x
array_of_hashetags << x.gsub(/\#/, "")
else
array_of_words << x
end
end
希望帮助