0

我已经浏览了一些关于 Java 正则表达式的在线教程,但我仍然发现构建正则表达式非常困难。

示例文本(一条推文):

@HIMYM_CBS: Barney Stinson. That Guy's Awesome

另一个样本:

Barney Stinson.  @HIMYM_CBS: That Guy's Awesome

这是发给 HIMYM_CBS 的推文。

我想要完成的是,给定任何推文,我想知道该推文是否发给任何人(例如在本例中为 HIMYM_CBS)。发给谁并不重要。

我的问题是:那么构建正则表达式来实现这一点我的思路应该是什么?

推文存储为字符串:

String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome";
4

5 回答 5

4

Twitter 用户名最长为 15 个字符,并以 @ 开头,并且只能包含字母数字和下划线。

所以你要使用的正则表达式是:

(?<=\s|\A)@(\w{1,15})
^   ^ ^^ ^^^^ ^     ^ ")" ends a matching group.
|   | || |||| | matches preceding expression between 1 and 15 times.
|   | || |||| "\w" matches [a-zA-Z0-9_]
|   | || ||| "(" begins a matching group
|   | || || literal "@"
|   | || | ")" ends the zero-width lookbehind assertion
|   | || "\A" will match the beginning of the string
|   | | "|" denotes that either this or that matches
|   | "\s" matches a space character
| "(?<=" is the beginning of a zero-width lookbehind assertion
于 2013-07-03T21:10:25.620 回答
2

正则表达式会

@\\w+

工作?

于 2013-07-03T20:51:26.880 回答
1
String tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome";
Pattern p = Pattern.compile("@(\\w+)");
Matcher m = p.matcher(tweet);
if (m.find()) {
  System.out.println(m.group(1));
} else {
  System.out.println("not found.");
}

也许您想查看Pattern类的 api 文档。

在代码\w中表示一个单词字符,它相当于[a-zA-Z_0-9].

于 2013-07-03T21:02:54.163 回答
1
/(?:^|(?<=\s))@([A-Za-z_0-9]+)(?=[.?,:]?\s)/

您只能在 Twitter 句柄中使用字母、数字或下划线符号 (_)。

示例测试用例:(
@This在行首匹配)正则表达式忽略@this,但匹配@separate标记以及句子末尾的标记,如@this. 还是@this?(不选择.?)和@this: 和@this,就像直接消息 SO 风格一样。是的,推文中的任何email@address.com 也会被忽略。

匹配时的正则表达式还@允许您通过从.userid@useridMatcher#group(1)

于 2013-07-03T21:09:47.217 回答
0
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String Tweet = "@HIMYM_CBS: Barney Stinson. That Guy's Awesome";
        String regex = "@([^:]+)";
        Pattern compile = Pattern.compile(regex);
        Matcher matcher = compile.matcher(Tweet);
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }

    }

}

输出 :HIMYM_CBS

于 2013-07-03T20:51:15.350 回答