【问题标题】:Android - Get specific text from TextViewAndroid - 从 TextView 获取特定文本
【发布时间】:2016-06-26 04:28:33
【问题描述】:

我试图在 TextView 中获取特定值,即 Youtube 链接。

我只想从 TextView 中提取链接,其中包含“检查一下!(Youtube 链接在这里)”。 “Check this out!”需要省略,只获取Youtube链接。 TextView 是用户输入的,因此会有所不同。

有什么建议吗?

【问题讨论】:

  • 你必须得到文本视图的整个文本,然后解析它。如果它总是以“检查一下!”开头这很容易 - 只需跳过那么多字母。如果它的变量更多,您需要查看正则表达式或其他自定义工作。
  • 您可能会发现setTag 很有用。
  • 我使用return Html.fromHtml(html).toString(); 得到了TextView 的整个文本。问题是,“检查一下!”只是一个例子。它是用户输入的,它可以而且会根据用户而改变。我已经得到了正则表达式,但不知道如何应用它来获取Youtube 链接..
  • setTag 有什么用处?
  • 可以粘贴字符串吗?

标签: android textview


【解决方案1】:

您可以使用带有Patterns.WEB_URL 正则表达式的正则表达式来查找文本中的所有网址。

【讨论】:

  • 我有 Youtube 链接的正则表达式,如何应用它?我知道如何匹配它,但只获得匹配正则表达式的值让我望而却步..
  • 您可以先过滤 Patterns.WEB_URL 并检查包含 youtube 关键字的链接
  • 你的回答帮助我接近了答案,谢谢!
【解决方案2】:

你可以试试:

String textViewStr = "Check this out! (Youtube link)";
int pos_1 = textViewStr.indexOf('(');
int pos_2 = textViewStr.indexOf(')');

String result = textViewStr.substring(pos_1+1,pos_2);
System.out.println(result); // print: Youtube link

更新

String textViewStr = "asdf Check this out! https://www.youtube.com/ asdg asfgf https:!!";
String [] arrStr = textViewStr.split(" ");
String regex = "/(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=‌​|watch\?.+&v=))((\w|-){11})(?:\S+)?$/g";
Pattern p = Pattern.compile(regex,Pattern.DOTALL);

        for(int i = 0 ; i < arrStr.length ; ++i){
            Matcher m = m = p.matcher(arrStr[i]);
            if ( m.matches() )
                Log.d("Matcher", "PATTERN MATCHES! " + arrStr[i]);
            else
                Log.d("MATCHER", "PATTERN DOES NOT MATCH! : " + arrStr[i]);
        }

这个印刷品:

D/MATCHER: PATTERN DOES NOT MATCH! : asdf
D/MATCHER: PATTERN DOES NOT MATCH! : Check
D/MATCHER: PATTERN DOES NOT MATCH! : this
D/MATCHER: PATTERN DOES NOT MATCH! : out!
D/Matcher: PATTERN MATCHES! https://www.youtube.com/
D/MATCHER: PATTERN DOES NOT MATCH! : asdg
D/MATCHER: PATTERN DOES NOT MATCH! : asfgf
D/MATCHER: PATTERN DOES NOT MATCH! : https:!!s

【讨论】:

  • String textViewStr = "Check this out! https://www.youtube.com/watch?v=MxX0a8UdjuI"; 现在只需找到它可以解决的 HTTPS 位置对吗? @KevinMurvie
  • @KevinMurvie 查看更新。您无法搜索 https,因为:“https 是一种安全协议。请参阅 https:////www.youtube.com/....”
  • 这是我的正则表达式 /(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/( ?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/g
  • 您通过您的正则表达式字符串更改“字符串正则表达式”,这应该可以工作。检查答案编辑。对于作为 url 的字符串来说,while 是不必要的。
【解决方案3】:

@BullyWiiPlaza answer试试这个方法

public static String extractYouTubeUrl(String text)
{
    String urlRegex = "((https?|ftp|gopher|telnet|file):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)";
    Pattern pattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);
    Matcher urlMatcher = pattern.matcher(text);

    while (urlMatcher.find())
    {
       String url = text.substring(urlMatcher.start(0),
                urlMatcher.end(0))
       if(url.contains("youtube.com")
        return url;
    }    
    return "";
}

使用方法:

String stringWithYouTubeUrl = tvWithYouTubeUrl.getText().toString();
String youTubeUrl = extractYouTubeUrl(stringWithYouTubeUrl);

Log.d(TAG, "youTubeUrl is" + youTubeUrl);

希望对你有帮助!!

【讨论】:

  • 我在RecyclerView 内的onBindViewHolder 方法中使用它,这是无效的,这意味着我不能使用return url.. 出于绝望,我做了if(url.contains("youtube.com")) youtubeVidUrl = url;,但正如预期的那样,它说youtubeVidUrl 可能尚未初始化..
  • 或者.. 获取列表的每个值直到它结束,但它对性能有影响..
  • 嗯,请您提供您的RecyclerView,以便我们更好地为您提供帮助...我将根据您的需要编辑我的答案
  • 从你的链接修改的东西,基本还是一样的,提取url,然后检查url是否包含youtube,如果有,获取url..谢谢! :D
  • 很高兴在大约一个小时内解决了这个问题(尽管可能仍然存在错误)哈哈哈! :D
【解决方案4】:

YouTube 链接语法为 https://www.youtube.com/watch?v=&lt;value&gt;。你真正需要的是v=&lt;value&gt;。只需在整个字符串中搜索“watch?”,如果之后有v=,那么只需获取该值并从中创建整个网址。

【讨论】:

  • 如果 TextView 仅包含 Youtube 链接,则我通过使用来自 SO 中的答案的名为 extractYoutubeId 的方法获得了值
  • 使用 String.indexOf("watch?");获取“手表”的索引?在整个字符串中。然后检查它后面是否有 v=,如果有,那么只需获取“=”之后的值。
猜你喜欢
  • 2015-03-13
  • 2012-03-09
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多