【问题标题】:Extracting Twitter username from a given text (JAVA, Regex)从给定文本中提取 Twitter 用户名(JAVA、Regex)
【发布时间】:2017-03-14 22:02:27
【问题描述】:

我相信代码没问题,问题是正则表达式。

基本上我想找到一个用户名提及(它以@开头),然后我想从给定的单词中提取允许的用户名部分。

例如,如果文本包含“@FOO!!”我只想提取“foo”,但我相信问题出在我的“split("[a-z0-9-_]+")[0]” 部分。

顺便说一句,允许的符号是数字、字母、- 和 _

public static Set<String> getMentionedUsers(List<Tweet> tweets) {

    Set<String> mentioned = new HashSet<>();

    for (Tweet tweet : tweets) {
        String tweetToAnal = null;
        if (tweet.getText().contains("@")) tweetToAnal = tweet.getText();
        if (tweetToAnal == null) continue;
        String[] splited = tweetToAnal.split("\\s+");
        for (String elem : splited) {

            String newElem = "";
            if (elem.startsWith("@")) {
                newElem = elem.substring(1).toLowerCase().split("[a-z0-9-_]+")[0];
            }

            if (newElem.length() > 0) mentioned.add(newElem);
       }

    }

    return mentioned;

}

【问题讨论】:

  • IIRC,Twitter api 将在推文的元数据中提供@mentions。您没有使用 API 吗?
  • 或使用经过验证的"@(\\w+)" 正则表达式。
  • 使用(?&lt;=@)[\w-]+ 应该足够了,你不需要拆分或任何东西......
  • @rmlan 不,我不能使用 API,推文已经是文本格式了。
  • @nozzleman 你能提供更多代码吗?我正在尝试提到 = (Set) Arrays.asList(tweet.getText().split("?

标签: java regex twitter


【解决方案1】:

问题不在于您的正则表达式,而在于您的逻辑。

您正在使用以下行来分析用户名:

if (elem.startsWith("@")) {
    newElem = elem.substring(1).toLowerCase().split("[a-z0-9-_]+")[0];
}

如果您逐步调试您的代码,您会注意到您正在使用(使用substring(1)@,然后您正在使用正则表达式进行拆分,因此此拆分也会占用您的所有字符。但是,您不想通过 split 方法使用字符,而只想捕获内容。

因此,您实际上可以通过使用您正在使用的否定正则表达式来使用 split:

split("[^a-z0-9-_]+")
        ^---- Notice the negate character class indicator

另一方面,您可以使用带有捕获组的正则表达式,然后获取您想要的用户名,而不是将整个文本拆分为多个标记以进行进一步分析。所以,不要有这个代码:

String[] splited = tweetToAnal.split("\\s+");
for (String elem : splited) {

String newElem = "";
if (elem.startsWith("@")) {
    newElem = elem.substring(1).toLowerCase().split("[a-z0-9-_]+")[0];
}

if (newElem.length() > 0) mentioned.add(newElem);

您可以使用更简单的代码,如下所示:

Matcher m = Pattern.compile("(?<=@)([\\w-]+)").matcher(tweetToAnal); // Analyze text with a regex that will capture usernames preceded by @

while (m.find()) { // Stores all username (without @)
    mentioned.add(m.group(1));
}

顺便说一句,我没有测试代码,所以我可能有错字,但你可以理解这个想法。无论如何,代码很容易理解。

【讨论】:

    【解决方案2】:

    我不是 Java 人员,但您可以使用以下正则表达式轻松匹配不带“@”的 twitter 用户名:

    (?<=@)[\w-]+
    

    can be seen here。当然,您需要正确转义特殊字符,但由于我不了解 Java,因此您必须自己执行此操作并进行实际匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-19
      • 2016-07-21
      • 1970-01-01
      • 2010-12-25
      • 2011-11-05
      • 2022-11-18
      • 1970-01-01
      • 2014-07-18
      相关资源
      最近更新 更多