在基于不区分大小写的搜索时替换时保留文本大小写?

时间:2014-10-15 21:53:46

标签: android replace textview

在我的应用中,我有一些带有文字的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

1 个答案:

答案 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

<强>更新

您可以在此页面中测试正则表达式:

http://www.regexplanet.com/advanced/java/index.html