gpt4 book ai didi

具有排除模式的 Java 正则表达式 replaceAll

转载 作者:行者123 更新时间:2023-11-29 05:37:15 25 4
gpt4 key购买 nike

我试图通过将每个关键字替换为 <b>kw</b> 来使搜索关键字在结果标题中加粗使用 replaceAll()方法。还需要忽略关键字中的任何特殊字符以突出显示。这是我正在使用的代码,但它在第二遍中双重替换了粗体指令。我正在寻找一个优雅的正则表达式解决方案,因为我的替代方案变得太大而无法涵盖所有​​情况。例如,使用此输入:

addHighLight("a b", "abacus") 

...我得到这个结果:

<<b>b</b>>a</<b>b</b>><b>b</b><<b>b</b>>a</<b>b</b>>cus

public static String addHighLight(String kw, String text) {
String highlighted = text;
if (kw != null && !kw.trim().isEmpty()) {
List<String> tokens = Arrays.asList(kw.split("[^\\p{L}\\p{N}]+"));
for(String token: tokens) {
try {
highlighted = highlighted.replaceAll("(?i)(" + token + ")", "<b>$1</b>");
} catch ( Exception e) {
e.printStackTrace();
}
}
}
return highlighted;
}

最佳答案

  1. 不要忘记使用Pattern.quote(token)(除非保证非正则表达式转义kw)
  2. 如果您必须使用 replaceAll()(而不是将输入标记化为 tag|text|tag|text|... 并仅将替换应用于文本,这会更简单和更快)-下面的代码应该有帮助

请注意,它效率不高 - 它匹配一些空的或已经突出显示的点,因此需要在替换后“固化”,但应该正确处理 XML/HTML 标签(CDATA 除外)。

这是一个“治愈”函数(没有空检查):

private static Pattern cureDoubleB = Pattern.compile("<b><b>([^<>]*)</b></b>");
private static Pattern cureEmptyB = Pattern.compile("<b></b>");
private static String cure(String input) {
return cureEmptyB.matcher(cureDoubleB.matcher(input).replaceAll("<b>$1</b>")).replaceAll("");
}

replaceAll 行应该是这样的:

String txt = "[^<>" + Pattern.quote(token.substring(0, 1).toLowerCase()) + Pattern.quote(token.substring(0, 1).toUpperCase()) +"]*";
highlighted = cure(highlighted.replaceAll("((<[^>]*>)*"+txt+")(((?i)" + Pattern.quote(token) + ")|("+txt+"))", "$1<b>$4</b>$5"));

关于具有排除模式的 Java 正则表达式 replaceAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com