#
ハッシュタグ、@
、または単語境界のいずれかに一致する正規表現を取得できないようです。目標は、文字列を Twitter のようなエンティティとトピックに分割することです。
input = "Hello @world, #ruby anotherString"
input.scan(entitiesRegex)
# => ["Hello", "@world", "#ruby", "anotherString"]
"anotherString"
大きすぎる単語を除いて、単語だけを取得するのは簡単です。
/\b\w{3,12}\b/
戻り["Hello", "world", "ruby"]
ます。@
残念ながら、これにはハッシュタグとsが含まれていません。それは簡単に動作するはずです:
/[\b@#]\w{3,12}\b/
しかし、それは戻ります["@world", "#ruby"]
。これにより、単語の境界は定義上文字ではないため、「単一の文字」のカテゴリに分類されず、一致しないことに気付きました。さらにいくつかの試み:
/\b|[@#]\w{3,12}\b/
戻ります["", "", "@world", "", "#ruby", "", "", ""]
。
/((\b|[@#])\w{3,12}\b)/
正しいものと一致しますが[[""], ["@"], ["#"], [""]]
、中括弧は囲まれたすべてをキャプチャすることも意味するため、期待どおりに返されます。
/((\b|[@#])\w{3,12}\b)/
作品の種類。返します[["Hello", ""], ["@world", "@"], ["#ruby", "#"]]
。これで、すべての正しいアイテムがそこにあり、各サブ配列の最初の要素に配置されています。次のスニペットは技術的に機能します。
input.scan(/((\b|[@#])\w{3,12}\b)/).collect(&:first)
collect
これを単純化して、後処理を必要としない正規表現だけで正しい部分文字列を一致させて返すことは可能ですか?