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

jam*_*mes 1 android replace textview

在我的应用程序中,我有一些带有文本的Textview.我正在尝试从用户那里获得输入,然后根据该输入突出显示Textview中的单词.

例如,如果文本是

Hello stackoverflow

并且用户的输入是

你好

我想用以下内容替换文本:

<font color='red'>Hello</font>` stackoverflow 
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

String input = //GETTING INPUT FROM THE USER
text= text.replaceAll(input,"<font color='red'>"+input+"</font>");
Textview.setText(Html.fromHtml(text));
Run Code Online (Sandbox Code Playgroud)

替换工作正常,但问题是我当前的代码更改了原始单词的情况,例如:

文本: HeLLo stackoverflow

输入:你好

我得到的: <font color='red'>hello</font> stackoverflow

我想要的: <font color='red'>HeLLo</font> stackoverflow

Car*_*les 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>");
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • (?i) :我想搜索一些不区分大小写的东西
  • "("+input+")":输入悫(),因为我们正在创建一个组,所以这个组以后可以refered
  • "<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)
Run Code Online (Sandbox Code Playgroud)

.将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换.调用str.replaceAll(regex,repl)形式的此方法会产生与表达式完全相同的结果

Pattern.compile(regex).matcher(str).replaceAll(repl)
Run Code Online (Sandbox Code Playgroud)

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同; 见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
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

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