Twitter用户名的正则表达式

39

我需要一个JavaScript正则表达式来匹配Twitter用户名。

该用户名由用户在注册时输入,所以我不想用太多错误通知分散他们的注意力。因此,我需要该表达式可以匹配有效的用户名,无论其前面是否有@符号。

Twitter用户名可以包含拉丁字符、下划线和数字,唯一的限制是长度最多为15个字符。(但是我需要正则表达式也能匹配16个字符,以防有人在用户名前面输入@符号)。


这个回答解决了你的问题吗?Twitter用户名的正则表达式 - Gajus
10个回答

61

This should do: ^@?(\w){1,15}$


11
尽管这将对原帖作者起作用,我只是想为那些不知道“正则表达式”的人提供一般性的评论。根据“正则表达式”引擎的版本,此测试仅在被检查的用户名是给定文本行或字符串中唯一存在的字符集时才匹配,这就是为什么它被夹在^和$之间的原因,但如果同一行或字符串中存在任何其他字符,包括空格字符,则此测试将失败...只是想说明这个事实,以免有人尝试将其用于全文搜索之类的事情。 :) - techexpert
1
这里的 ? 有什么作用? - San
1
这是一个量词符号,意味着前面的类/组/字符将被匹配0或1次。 - asenovm
1
不要忘记,Twitter 句柄名称中不能包含单词“admin”或“twitter”。 - ganders
如果将重复器放在捕获组之外,它只会捕获\w的最后一个可能匹配项。例如,@zac将仅捕获组c。要使其捕获整个句柄,请将重复器放在括号内,如 ^@?(\w{1,15})$ - Merchako
@asenovm 我原以为 Twitter 用户名必须以 @ 开头。但是 ? 使 @ 变成可选项... - Charles Robertson

46

这是我找到的最佳解决方案,用于替换多个Twitter用户名的多个出现。

实现此功能的正则表达式为/(^|[^@\w])@(\w{1,15})\b/。我捕获了@字符后面的内容,以便能够正确地替换用户名。并且我使用全局匹配标志(g),这样它就会替换所有出现的用户名。 asenovm的答案很简单,但在大多数用户输入上下文中都不起作用,正如techexpert他的评论中所解释的那样。

var output,
    text    = "@RayFranco is answering to @AnPel, this is a real '@username83' but this is an@email.com, and this is a @probablyfaketwitterusername",
    regex   = /(^|[^@\w])@(\w{1,15})\b/g,
    replace = '$1<a href="http://twitter.com/$2">@$2</a>';

output = text.replace( regex, replace );

console.log ( output );

这给了我期望中的结果(使用node v0.9.1测试过)

@RayFranco在回答@AnPel,这是一个真实的"@username83",但这是一个email地址,并且这是@probablyfaketwitterusername。

这基于Twitter关于用户名的“规范”

您的用户名不能超过15个字符。您的真实姓名可以更长(20个字符),但出于简便起见,用户名要保持较短。用户名只能包含字母数字字符(A-Z字母,0-9数字),下划线除外,如上所述。请检查您想要的用户名是否含有任何符号、破折号或空格。

希望这可以帮到你。


6

@[a-zA-Z0-9_]{0,15}

可以用来从混合数据中筛选出 Twitter 用户名。


6
一个简短且容易的方法如下:

一种简单易行的方式:

function validTwitteUser(sn) {
    return /^[a-zA-Z0-9_]{1,15}$/.test(sn);
}

太完美了... 如果有人不想让他们的正则表达式以数字开头,他们可以将上面的正则表达式修改为 /^[a-zA-Z_]{1}[a-zA-Z0-9_]{0,14}$/。 - vishal gaware

3

另一个可以起作用的正则表达式是:

/(?<!\w)@[\w+]{1,15}\b/

  • 第一部分(?<!\w)@匹配@,如果它之前没有字符值,则可以将其用作潜在电子邮件地址的过滤器,其格式为text@mail.com。由于@之前有文本,因此不会匹配电子邮件地址。

  • 第二部分 [\w+]{1,15}\b 匹配单词字符字符串,即 a-z、A-Z、0-9 和 _,这些字符在 Twitter 用户名中被接受。\b 单词边界锚点匹配单词字符和非单词字符之间的空格。Twitter 用户名不接受非单词字符,因此由于 \b而排除了它们。

最后,我提供了一张图片,在该图片中,我测试了所提议的正则表达式对 rayfranco 给出的第二个得票率最高的答案提供的文本进行匹配。

截图,screenshot image


1
我认为这里有一个错别字,\b 后面多了一个不必要的空格? - mjsarfatti
1
谢谢 @mjsarfatt 你是正确的。 我的意思是写成 /(?<!\w)@[\w+]{1,15}\b/ - inpap

2
这可能对于“完全匹配”有所帮助:

^@(?=.*\w)[\w]{1,15}$

测试:@John_Doe2000

结果:

Match 1
Full match  0-13    @John_Doe2000

尝试在这里使用 正则表达式101

1

为了排除“非拉丁”字符,您需要使用:^@?([a-zA-Z0-9_]){1,15}$。因为\w接受“任何单词字符”。而非拉丁字符符合此条件。因此,它甚至匹配像土耳其字符üö这样的字符。


1
这不是真的。\w 只匹配 [a-zA-Z0-9_],没有其他字符。 - asenovm
2
在发表评论之前,请至少测试并确保其正确。请在此处查看:http://jsfiddle.net/wBPEQ/ - Osman Turan
1
我不明白这证明了什么。我只是在说 \w 和 [a-zA-Z0-9_] 是一样的,而且 \w 不匹配英文字母表以外的字母。 - asenovm
1
正则表达式的实现似乎因平台而异。在.NET上可以工作,但在浏览器上会失败。 - Osman Turan

1
为了进一步解释@asenovm的答案,这将选择不在字符串中的Twitter句柄,并且还将选择转推中存在的冒号:
@(\w){1,15}(:|)

0
我认为正确的正则表达式是这个 /^@(\w){1,15}/g,在@(at)符号上不需要加问号。

0

或许这超出了你的需要,但我在另一个帖子中找到了这个 "正则表达式如何替换推特链接". 它可以包含 @用户名、#标签和urls。对我来说很有效。

function processTweetLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
    text = text.replace(exp, "<a href='$1' target='_blank'>$1</a>");
    exp = /(^|\s)#(\w+)/g;
    text = text.replace(exp, "$1<a href='https://twitter.com/hashtag/$2?src=hash' target='_blank'>#$2</a>");
    exp = /(^|\s)@(\w+)/g;
    text = text.replace(exp, "$1<a href='http://www.twitter.com/$2' target='_blank'>@$2</a>");
    return text;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接