【问题标题】:Trying to construct a regex to match tagged usernames尝试构建一个正则表达式来匹配标记的用户名
【发布时间】:2012-11-26 01:51:19
【问题描述】:

我正在尝试构建一个匹配标记的 facebook 用户名(@username1 @user.name、@user_name 等)的正则表达式(在 C# 中)。我认为 facebook 用户名可以包含字母数字、破折号、句点和下划线字符。

这个只匹配字母数字字符,但我需要一个也可以接受句点、破折号或下划线的字符:

MatchCollection results = Regex.Matches(text, "@\\w+");

任何帮助,非常感谢,谢谢!

【问题讨论】:

    标签: c# .net regex facebook string


    【解决方案1】:

    试试这个:

    MatchCollection results = Regex.Matches(text, @"@[\w.-]+");
    

    但是,这也将匹配电子邮件地址的域部分(因为根据您的规范,点是允许的字符)。如果你不想这样,你可以添加一个否定的lookbehind断言来确保@之前没有非空格字符:

    MatchCollection results = Regex.Matches(text, @"(?<!\S)@[\w.-]+");
    

    【讨论】:

    • 事实证明,这也匹配用户名后跟一个句点(即使句点是句子的一部分而不是用户名的一部分)。例如,在这句话“保重@john”中。 ,它认为用户名是“john”。我怎样才能使这个正则表达式更智能,以便它忽略用户名末尾的句点?我的猜测是 Facebook 无论如何都不允许用户名末尾有句点。
    • 您可以在正则表达式的末尾添加(?&lt;!\.)。这样可以确保最后一个字符不是句点。
    【解决方案2】:

    使用“完整列表”版本:

    MatchCollection results = Regex.Matches(txt, @"(?:^|(?<=\s))@[a-zA-Z0-9_.-]+(?=\s|$)");
    

    或短版 (\w = [a-zA-Z0-9_])

    MatchCollection results = Regex.Matches(txt, @"(?:^|(?<=\s))@[\w.-]+(?=\s|$)");
    

    【讨论】:

      【解决方案3】:

      你也可以这样做

      List<string> tagedNames=Regex.Matches(text,@"(?<=(\s|^))@[\w.-]+")
                                   .Cast<Match>()
                                   .Select(x=>x.Value)
                                   .ToList<string>();
      

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        相关资源
        最近更新 更多