8

我有以下示例推文:

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

我只想拥有user1thinguser2

我可以使用什么正则表达式来提取这三个名称?

PS:用户名只能包含字母、数字和下划线。

4

5 回答 5

17

测试:

/@([a-z0-9_]+)/i

在红宝石(irb)中:

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

在 Python 中:

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

在 PHP 中:

<?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
)
于 2009-04-11T18:40:18.603 回答
2

尝试使用此正则表达式的迭代器(findall):

(@[\w-]+)

再见

于 2009-04-12T10:23:44.077 回答
2
/(?<!\w)@(\w+)/

以上涵盖了以下场景,该线程中的其他答案没有:

  • 不应该是用户名的 @ 符号,例如“我的电子邮件是 test@example.com”
  • 仍然允许在字符串开头的用户名,例如“@username lorem ipsum...”
于 2012-07-25T05:08:45.260 回答
1

在您的项目中包含 twitter 文本库 [1] 以解决此文本问题是一个好主意。

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

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

于 2014-04-23T13:55:04.387 回答
0

应该这样做(为方便起见,我使用了命名捕获):

.+?@(?[a-zA-Z0-9_]+):[^@]+?@(?[^\s]+)[^@]+?@(?[a-zA-Z0- 9_]+)

于 2009-04-11T18:51:53.943 回答