从EditText中获取所有的hashtags

6

我有一个 EdiText。用户可以在其中提及 hashtags。我想从中获取这些 hashtags 并将它们添加到一个 ArrayList 中。如何从 EdiText 中获取这些 hashtags。

假设我的 edittxtmsg 包含 #Stackoverflow slove me #hashtag #problem

我希望获得以下这些 hashtags: #Stackoverflow #hashtag #problem

edittxtmsg.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub

                    int strLenght = s.toString().length();
                    int available = 140 - strLenght;
                    setAvailableSpace(available);
                    if (available < 0) {
                        s.delete(strLenght - 1, strLenght);
                    }
                    mfinalmsg = s.toString();


                }

                private void setAvailableSpace(int available) {
                    // TODO Auto-generated method stub
                    tvcount.setText(available + "");
                }
            });

你有文本消息和哈希标签过滤器。你可能认为有一种方法可以将这两者结合起来从文本中获取信息?Linkify可能没有这样的方法,因为它不是用于这种方式的,虽然我对它不是很熟悉。我相信在这里肯定有专家能够回答这个问题。 - G_V
有没有其他方法可以从EditText中获取标签和提及的内容? - Sree Reddy Menon
2个回答

9
您可以使用正则表达式从EditText中获取所有的Hashtag:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

String text = editText.getText().toString();
String regexPattern = "(#\\w+)";

Pattern p = Pattern.compile(regexPattern);
Matcher m = p.matcher(text);
while (m.find()) {
    String hashtag = m.group(1);
    // Add hashtag to ArrayList
    ...
}

(#\\w+) 能匹配所有以 # 开头的 hashtag。

这个也很快。

enter image description here


谢谢程序员!如果我的EditText中不含空格和文字(已测试),但仍然显示为井号而不应该是井号,该怎么办? - Sree Reddy Menon
1
然后使用 (#\\w+) - Software Engineer
@TimCastelijns 谢谢! - Software Engineer
@程序员帮助其他不为人知的英雄 ;-) 还发现我们的方法一样快/慢是很酷的。 - Tim
如果您的标签包含特殊字符,例如#hashtag-1,它将无法捕获“-1”... 请帮忙。 - DragonFire

5
String text = editText.getText().toString();
String[] words = text.split(" ");    
List<String> tags = new ArrayList<String>();

for ( String word : words) {
    if (word.substring(0, 1).equals("#")) {
        tags.add(word);    
    }
}

获取editText中的文本,将其分割成单独的单词,创建一个包含所有以#开头的单词的列表。

正如Yazan所提到的,一个很好的替代if (word.substring(0, 1).equals("#")的方法是if (word.startsWith("#"))。

时间

enter image description here


只是一个问题,substring()相对于startsWith()有什么优势吗? - Yazan
2
@Yazan 不太确定,我读到了这个话题,说substring至少比其他两种方法快,但startsWith()当然也是一个很好的选择。https://dev59.com/VWMl5IYBdhLWcg3wsIuA - Tim
@SrikanthAppvolution 我添加了一个测试运行时间。 - Tim
让我们在聊天中继续这个讨论 - Sree Reddy Menon
这个答案将会识别一个单词中的特殊字符,这非常重要。 - DragonFire
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接