如何使用 ReplaceFirst() 进行不区分大小写的文本替换。

huangapple go评论79阅读模式
英文:

How to replace text using ReplaceFirst() without case sensitivity

问题

我正在尝试创建一个方法,根据用户输入的搜索文本在 jlabel 中突出显示文本。除了区分大小写外,它的功能很好。我使用了正则表达式 (?i) 来忽略大小写。但是它仍然区分大小写。

private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) {                                      
    String SourceText = "this is a sample text";
    String SearchText = jTextField1.getText();

    if (SourceText.toLowerCase().contains(SearchText.toLowerCase())) {
        String OutPut = "<html>" + SourceText.replaceFirst("(?i)" + SearchText, "<span style=\"background-color: #d5f4e6;\">"
                + SearchText + "</span>") + "</html>";
        jLabel1.setText(OutPut);
    } else {
        jLabel1.setText(SourceText);
    }
}

更新

contains 方法是区分大小写的。

如何以 Java 中不区分大小写的方式检查一个字符串是否包含另一个字符串

英文:

I'm trying to create a method which can highlight text in a jlabel according user entered search text. it works fine except it case sensitive. I used a regex (?i) to ignore case. But still it case sensitive.

private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) {                                        
        String SourceText = &quot;this is a sample text&quot;;
        String SearchText = jTextField1.getText();

        if (SourceText.contains(SearchText)) {
            String OutPut = &quot;&lt;html&gt;&quot; + SourceText.replaceFirst(&quot;(?i)&quot; + SearchText, &quot;&lt;span style=\&quot;background-color: #d5f4e6;\&quot;&gt;&quot; + SearchText + &quot;&lt;/span&gt;&quot;) + &quot;&lt;/html&gt;&quot;;
            jLabel1.setText(OutPut);
        } else {
            jLabel1.setText(SourceText);
        }
    }

How can i fix this.

Update

contains is case sensitive.

How to check if a String contains another String in a case insensitive manner in Java

答案1

得分: 1

你在替换中没有使用匹配的文本,而是在替换中硬编码了与搜索中使用的相同字符串。由于您使用 html 标签包装整个匹配,您需要在替换中使用 $0 回引(它指的是位于第 0 组的整个匹配)。

此外,您没有对搜索词进行转义(使用 &quot; 进行引用),如果 SearchText 包含特殊的正则表达式元字符,可能会引发问题。

您可以使用以下代码来修复:

String OutPut = "<html>" + SourceText.replaceFirst("(?i)" + Pattern.quote(SearchText), "<span style=\"background-color: #d5f4e6;\">$0</span>") + "</html>";
英文:

You have not used the matched text in the replacement, you hard-coded the same string you used in the search. Since you wrap the whole match with html tags, you need to use the $0 backreference in the replacement (it refers to the whole match that resides in Group 0).

Besides, you have not escaped ("quoted") the search term, it may cause trouble if the SearchText contains special regex metacharacters.

You can fix the code using

String OutPut = &quot;&lt;html&gt;&quot; + SourceText.replaceFirst(&quot;(?i)&quot; + Pattern.quote(SearchText), &quot;&lt;span style=\&quot;background-color: #d5f4e6;\&quot;&gt;$0&lt;/span&gt;&quot;) + &quot;&lt;/html&gt;&quot;;

huangapple
  • 本文由 发表于 2020年9月23日 19:00:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/64026485.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定