在我的应用中,我有一些带有文字的Textview。我试图从用户那里获得输入,然后根据该输入突出显示Textview中的单词。
例如,如果文字是
Hello stackoverflow
并且用户的输入是
您好
我想用以下内容替换文字:
<font color='red'>Hello</font>` stackoverflow
这是我的代码:
String input = //GETTING INPUT FROM THE USER
text= text.replaceAll(input,"<font color='red'>"+input+"</font>");
Textview.setText(Html.fromHtml(text));
替换正在运行,但问题是我当前的代码更改了原始单词的情况,例如:
文字: HeLLo stackoverflow
输入:你好
我得到了什么: <font color='red'>hello</font>
stackoverflow
我想要的是什么: <font color='red'>HeLLo</font>
stackoverflow
答案 0 :(得分:5)
你必须考虑正则表达式。
replaceAll
允许您使用正则表达式,因此,您可以替换找到的确切事件的文本。
例如,如果找到Hello,则将其替换为<font color='red'>Hello</font>
。
如果找到HeLLo,则将其替换为<font color='red'>HeLLo</font>
您的代码应该像以下一样简单:
String highlighted = text.replaceAll("(?i)("+input+")","<font color='red'>$1</font>");
这意味着:
(?i)
:我想搜索不区分大小写的内容"("+input+")"
:输入位于(
和)
之间,因为我们正在创建一个群组,因此可以稍后提及此群组"<font color='red'>$1</font>"
:不是用输入替换,而是改变大小写,我们用`$ 1替换它,即对第一个匹配组的引用。这意味着我们希望使用找到的确切单词替换它。但是,请尝试并继续玩,因为正则表达式很棘手。
如果您使用Pattern
类,则更容易也更清晰。
您可以在这里阅读更多内容:
http://developer.android.com/reference/java/util/regex/Pattern.html
另外,您可以看看如何做到这一点: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29
public String replaceAll(String regex, String replacement)
。 将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换。 调用str.replaceAll(regex,repl)形式的此方法会产生与表达式
完全相同的结果Pattern.compile(regex).matcher(str).replaceAll(repl)
请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。
Parameters:
regex - the regular expression to which this string is to be matched
replacement - the string to be substituted for each match
Returns:
The resulting String
<强>更新强>
您可以在此页面中测试正则表达式: