【问题标题】:Preserve text case when replacing based on case-insensitive search?基于不区分大小写的搜索替换时保留文本大小写?
【发布时间】:2017-12-11 20:02:27
【问题描述】:

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

例如,如果文本是

你好堆栈溢出

用户的输入是

你好

我想将文本替换为:

<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));

并且替换是有效的,但问题是我当前的代码改变了原来的单词大小写,例如:

文字:你好堆栈溢出

输入:你好

我得到了什么:&lt;font color='red'&gt;hello&lt;/font&gt;stackoverflow

我想要什么: &lt;font color='red'&gt;HeLLo&lt;/font&gt;stackoverflow

【问题讨论】:

  • james,我还是不明白你的意思,你所说的突出显示和你的各种例子是什么意思?大写?
  • 抱歉不清楚,我正在做一种大文本搜索,用户输入一个词--->应用程序正在文本中寻找它—— >最后,显示相同的文本,但现在突出显示搜索的单词。像这样:hugoware.net/resource/blog/search-highlight/…

标签: android replace textview


【解决方案1】:

你必须考虑正则表达式。

replaceAll 允许您使用正则表达式,因此您可以将文本替换为找到的确切匹配项。 例如,如果找到 Hello,它将替换为 &lt;font color='red'&gt;Hello&lt;/font&gt;。 如果找到 HeLLo,则将其替换为 &lt;font color='red'&gt;HeLLo&lt;/font&gt;

您的代码应该很简单:

String highlighted = text.replaceAll("(?i)("+input+")","<font color='red'>$1</font>");

这意味着:

  • (?i) : 我想搜索一些东西,不区分大小写
  • "("+input+")" :输入在()之间,因为我们正在创建一个组,所以这个组可以稍后参考
  • "&lt;font color='red'&gt;$1&lt;/font&gt;" :不是用输入替换,这会改变大小写,我们用 `$1 替换它,这是对第一个匹配组的引用。这意味着我们要使用找到的确切单词来替换它。

但是请尝试一下并继续玩,因为正则表达式很棘手。

其他读取

如果你使用Patternclass 会更容易更清楚。

您可以在这里阅读更多内容:

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

【讨论】:

  • 或许可以考虑使用Pattern.compile(regex, Pattern.CASE_INSENSITIVE)...
  • 您好,谢谢您的回复,我有点困惑,您能提供一个结合这两者的例子吗?
  • 我认为holder=holder.replaceAll("("+input+")", "&lt;font color='red'&gt;$1&lt;/font&gt;"); Textview.setText(Html.fromHtml(holder)); 就足够了。我现在不能尝试。使用 Pattern 将类似于 holder=Pattern.compile("("+input+")",, Pattern.CASE_INSENSITIVE).matcher(holder).replaceAll("$1")
  • 此外,此代码突出显示所有出现,而不仅仅是第一个!尝试使用多次包含该单词的文本
  • @CarlosRobles Carlos 你是个真正的魔术师!,那组技巧就是关键
猜你喜欢
  • 2012-02-03
  • 2011-12-22
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多