8

RubyonRailsを使用して簡単な大学のプロジェクトのハッシュタグを抽出しようとしています。数字のみを含むタグとスペースのないタグで問題が発生しています。

text = "Pack my #box with #5 dozen liquor.#jugs link.com/liquor#jugs #2good #first#second"

私が持っている正規表現は/(?:^|\s)#(\w+)/iソース)です

この正規表現は#["box", "5", "2good", "first"]

#["box", "2good"]残りは「実際の」ハッシュタグではないため、それが返されるだけで残りを無視するようにするにはどうすればよいですか?

4

3 に答える 3

10

この正規表現を試すことができますか:

/(?:^|\s)(?:(?:#\d+?)|(#\w+?))\s/i

更新 1:
#blah23blah や #23blah23 のように、上記の正規表現が一致しない場合がいくつかあります。したがって、すべてのケースを処理するように正規表現を変更しました。

正規表現:

/(?:\s|^)(?:#(?!\d+(?:\s|$)))(\w+)(?=\s|$)/i

壊す:

  • (?:\s|^)-- 前のスペースまたは行頭に一致します。試合をキャプチャしません。
  • #-- ハッシュに一致しますが、キャプチャしません。
  • (?!\d+(?:\s|$)))-- # とスペース (または行末) の間のすべての数字を避けるための否定先読み
  • (\w+)-- すべての単語文字に一致してキャプチャします
  • (?=\s|$)-- 次のスペースまたは行末を確実にするための正の先読み。これは、隣接する有効なハッシュ タグと一致するようにするために必要です。

ほとんどのケースをキャプチャするために変更されたサンプル テキスト:

#何とか #箱に #5 ダース #good2 #3good 酒を詰めてください。

一致:

マッチ 1:何とか
マッチ 2: ボックス
マッチ 3: good2
マッチ 4: 3good
マッチ 5: mkvef214asdwq
マッチ 6: 3e4
マッチ 7: 2good

ルーブルリンク

更新 2:

アンダースコアで始まる単語またはアンダースコアで終わる単語を除外するには、次のように除外を否定先読みに含めます。

/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/i

サンプル、正規表現、および一致は、このRubular リンクに記録されています

于 2012-08-24T03:55:04.097 に答える
2

私はこのようにそれについて行きます:

text.scan(/ #[[:digit:]]?[[:alpha:]]+ /).map{ |s| s.strip[1..-1] }

戻り値:

[
    [0] "box",
    [1] "2good"
]

私は正規表現ですべてをやろうとはしません。私はそれらをできるだけシンプルに保つことを好み、基本的なデータを取得したらフィルタリングして切断します。私の推論は、正規表現が複雑になればなるほど維持するのが難しくなるということです。パターンを維持するよりも、何か他のことをすることに時間を費やしたいと思っています。

于 2012-08-24T03:41:22.843 に答える
1

これを試して:

/\s#([[\d]]?[[a-z]]+\s)/i

出力:

1.9.3-p194 :010 > text = "Pack my #box with #5 dozen liquor.#jugs link.com/liquor#jugs #2good #first#second"
 => "Pack my #box with #5 dozen liquor.#jugs link.com/liquor#jugs #2good #first#second" 
1.9.3-p194 :011 > puts text.scan /\s#([[\d]]?[[a-z]]+\s)/i 
box 
2good 
 => nil
于 2012-08-24T11:35:32.193 に答える