2009-04-11 16 views
7

私は次の例のつぶやきを持っています:RegExp:ツイート(twitter.com)からユーザー名を抽出する方法は?

RT @ user1:who is @thing and @ user2?

私だけUSER1user2のを持っていると思います。

これら3つの名前を抽出するためにどのような正規表現を使用できますか?

PS:ユーザー名には、文字、数字、下線のみを使用する必要があります。

答えて

16

はテストさ:

/@([a-z0-9_]+)/i 
ルビー(IRB)に

:Pythonで

>> "RT @user1: who are @thing and @user2?".scan(/@([a-z0-9_]+)/i) 
=> [["user1"], ["thing"], ["user2"]] 

:PHPで

>>> import re 
>>> re.findall("@([a-z0-9_]+)", "RT @user1: who are @thing and @user2?", re.I) 
['user1', 'thing', 'user2'] 

<?PHP 
$matches = array(); 
preg_match_all(
    "/@([a-z0-9_]+)/i", 
    "RT @user1: who are @thing and @user2?", 
    $matches); 

print_r($matches[1]); 
?> 

Array 
(
    [0] => user1 
    [1] => thing 
    [2] => user2 
) 
+0

をあなたは[-Z0-9_]、すなわち、@([-ZA-Z0-9 _] +)を中心にキャプチャグループを追加する必要があります –

+0

おかげで、それはうまく動作します!最後の1つの質問:「@」の前にスペースがなければならない場合、または先頭にスペースがなければならない場合は、次の式を使用できますか? "/(| ^)@([a-z0-9 _] +)/ i" – caw

+0

lookbehindを使う - http://www.regular-expressions.info/lookaround.html – user4812

0

この(私は便宜上名付けキャプチャを使用)、それを実行する必要があります。?

+ @(?[-ZA-Z0-9 _] +):??[^ @] + @([^ \ S] +)[^ @] + @([-ZA-Z0-9 _] +)

+0

PHPは、式を使用するとエラーメッセージを表示します。 「最後にデリミタが見つからない」ようなもの。 – caw

1

この正規表現での反復子(findAllの)試してみてください??

(@[\w-]+) 

別れを

+0

シンプルで素敵! scan(ruby)と組み合わせて、一連のマッチを得る:text.scan(/ @ [\ w - ] + /) – Danny

2
/(?<!\w)@(\w+)/ 

上記には、次のシナリオが含まれています。このスレッドでは、次のようにはなりません。

  • @記号はユーザー名ではないと考えられます。 "私のメールアドレスは[email protected]"
  • 文字列の先頭にあるユーザー名を許可します。 "@username lorem ipsum ..."
+0

ありがとう。他の誰も電子メールアドレスの問題を考慮していません! – innonate

0

このテキストの問題を解決するには、あなたのプロジェクトにtwitterテキストライブラリ[1]を含めることをお勧めします。

twttr.txt.extractMentions("a very generic twitt with some @mention"); 

[1] https://github.com/twitter/twitter-text-js

関連する問題