【问题标题】:Regular expression for twitter usernametwitter用户名的正则表达式
【发布时间】:2012-01-28 19:37:24
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript regex


【解决方案1】:

这应该是: ^@?(\w){1,15}$

【讨论】:

  • 尽管它只适用于 OP,但只是想为那些不知道“正则表达式”的人做一个一般性的评论。此测试仅在被检查的用户名是给定文本行或字符串中存在的唯一字符集时才会匹配,具体取决于“正则表达式”引擎的版本,这就是它包含在 ^ 和 $ 之间的原因,但是这个测试如果在同一行或字符串中存在任何其他字符,包括空格字符,则会失败......只是想说明事实,所以有人不会尝试将其用于全文搜索之类的东西。 :)
  • ?在这里的作用是什么?
  • 它是一个量词,表示前面的类/组/字符要匹配0次或1次
  • 不要忘记 Twitter 句柄不允许在名称/句柄中的任何位置使用“admin”或“twitter”字样
  • 如果你把转发器放在捕获组之外,它只会捕获\w的最后一个可能的匹配。例如,@zac 将捕获组 c。要使其捕获整个句柄,请将转发器放在括号内,如^@?(\w{1,15})$
【解决方案2】:

这是我发现的最好的解决方案,用于替换多次出现的 twitter 用户名。

解决问题的正则表达式是/(^|[^@\w])@(\w{1,15})\b/。我正在捕捉 @ 字符后面的内容,以便我可以正确替换用户名。而且我正在使用全局匹配标志(g),因此它将替换所有出现。 asenovm 答案很简单,但在大多数用户输入上下文中都不起作用,正如 techexperthis comment 中解释的那样。

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 );

这给了我我的预期(使用节点 v0.9.1 测试)

@RayFranco 正在回复@AnPel,这是一个真实的“@username83”,但这是一个@email.com,这是一个@probablyfaketwitter 用户名

这是基于Twitter "specs" for username

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    一个简单的方法:

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

    【讨论】:

    • 完美... -zA-Z0-9_]{0,14}$/
    【解决方案4】:

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

    您可以使用上述正则表达式从混合数据集中对 twitter 用户名进行排序

    【讨论】:

      【解决方案5】:

      这可能对Full Match 有帮助:

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

      测试:@John_Doe2000

      结果:

      Match 1
      Full match  0-13    @John_Doe2000
      

      试试Here

      【讨论】:

        【解决方案6】:

        另一个做这项工作的人是:

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

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

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

        最后但并非最不重要的一点是,我提供了一张图片,其中我在 rayfranco 投票第二多的答案中提供的文本上测试了建议的正则表达式,以检查匹配项。

        截图,

        【讨论】:

        • 我相信有一个错字,\b 后面的多余空格?
        • 谢谢@mjsarfatt,你是对的。我的意思是写/(?&lt;!\w)@[\w+]{1,15}\b/
        【解决方案7】:

        为了扩展@asenovm 的答案,这将选择本身不在字符串中的推特句柄,并且还将选择转推中存在的冒号:

        @(\w){1,15}(:|)
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 这不是真的。 \w 与 [a-zA-Z0-9_] 完全匹配,仅此而已。
          • 在评论某事之前,请至少对其进行测试并确保它是真实的。在这里查看:jsfiddle.net/wBPEQ
          • 我看不出这证明了什么。我要说的是 \w 与 [a-zA-Z0-9_] 相同,并且 \w 不匹配英文字母表中的其他字母。
          • 似乎正则表达式实现因平台而异。它在 .NET 上以这种方式工作,但在浏览器上失败。
          【解决方案9】:

          这可能超出了您的需要,但我在另一篇帖子“regex how to replace twitter links”中找到了这个。包装@usernames、#hashtags 和url。对我来说工作得很好。

          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;
          }
          

          【讨论】:

            【解决方案10】:

            我认为正确的正则表达式是 /^@(\w){1,15}/g 没有 ?在@(at)

            【讨论】:

              猜你喜欢
              • 2011-01-19
              • 2019-05-06
              • 2011-05-24
              • 2019-04-01
              • 2011-02-15
              • 2011-07-12
              相关资源
              最近更新 更多