这个正则表达式有什么问题?

时间:2011-01-30 17:44:48

标签: java android regex

我需要在Android-App中匹配Twitter-Hashtags,但我的代码似乎没有做到它应该做的事情。 我想出的是:

ArrayList<String> tags = new ArrayList<String>(0);
Pattern p = Pattern.compile("\b#[a-z]+", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(tweet); // tweet contains the tweet as a String
while(m.find()){
    tags.add(m.group());
}

变量tweet包含一个包含hashtags的常规推文 - 但find()不会触发。所以我想我的正则表达式是错误的。

2 个答案:

答案 0 :(得分:3)

由于\b字边界锚,你的正则表达式失败了。此锚仅在非单词字符和单词字符(字母数字字符)之间匹配。因此,将它直接放在#前面会导致正则表达式失败,除非 #之前有一个字母数字字符!您的正则表达式会匹配foobarfoo#hashtag blahblahblah中的主题标签,但不会匹配foobarfoo #hashtag blahblahblah中的主题标签。

请改用#\w+,并记住,在字符串中,您需要加倍反斜杠:

Pattern p = Pattern.compile("#\\w+");

答案 1 :(得分:2)

如果您尝试匹配哈希标记,则您的模式应为“#(\\ w +)”。使用这个和推特“转发披萨到#pizzahut”,做m.group()会给“#pizzahut”而m.group(1)会给“pizzahut”。

编辑:注意,html显示正在搞乱转义的反斜杠,你需要在Java的字符串文字中有两个w。