)", "$1"); 需要做什么 keyword并在 HTML 页面上-6ren">
gpt4 book ai didi

java - 将替换正则表达式转换为 java 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:36 25 4
gpt4 key购买 nike

我有以下 java 正则表达式替换逻辑

text.replaceAll("(?i)(" + keyword + ")(?!([^<]+)?>>)", "<b>$1</b>");

需要做什么 keyword并在 HTML 页面上查找它,同时忽略 HTML 标记的大小写和内容。然后它捕获找到的关键字并用 <b></b> 包围它标签。

我应该如何使用 StringBuilder 执行此操作?或 StringBuffer , 可能 HashMap ?目标是提高性能。

更新

我使用新的 commons lang 3 beta package 创建了以下方法:

public static String highlight(String text, String q) {
String[] textAr = StringUtils.split(text, " ");
int len = textAr.length;
int index = 0;
while (index < len){
if (textAr[index].startsWith("<")) {
while (!textAr[index].endsWith(">")) {
index++;
}
}
if (StringUtils.equalsIgnoreCase(textAr[index], q)){

textAr[index] = "<b>"+textAr[index]+"</b>";
}
index++;
}
return StringUtils.join(textAr," ");
}

运行几次测试后,我从上述解决方案中获得了大约 10% 的性能提升。任何关于如何在没有正则表达式的情况下让它变得更好的建议将不胜感激。

最佳答案

虽然我同意 Nikita 的观点:解析 HTML 的最佳方法是使用 HTML 或 XML 解析器。

但如果您真的需要这个,这里有一些提示。

  1. string buffer 是 string builder 的线程安全版本,因此如果您不需要线程安全或者线程安全问题已由其他层解决,请使用 string builder。
  2. StringBuilder 不支持使用模式替换。字符串确实支持。但是当关键字数量很多时直接使用字符串是无效的。
  3. 因此,最有效的方法是生成包含所有关键字的模式,然后执行一次替换操作。例如,如果您有关键字 foo、bar、tar,请创建正则表达式 regex = (?i)(foo|bar|tar)(?!([^<]+)?>>)

现在运行 text.replaceAll(regex);

您可以在创建正则表达式时使用 StringBuilder,但我建议您使用 StringUtils.join()来自 jakarta utils 或来自 Guava 的类似实用程序。

关于java - 将替换正则表达式转换为 java 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774814/

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