当前位置: 首页 > 知识库问答 >
问题:

Java一次替换一个字符串中的多个子字符串(或以最有效的方式)

羿博延
2023-03-14

我需要以最有效的方式替换一个字符串中许多不同的子字符串。除了使用string.replace替换每个字段的蛮力方法之外,还有其他方法吗?

共有1个答案

班建义
2023-03-14

如果要操作的字符串很长,或者要操作很多字符串,那么使用java.util.regex.matcher可能是值得的(这需要提前编译时间,所以如果输入很小或者搜索模式经常变化,那么它就不会高效)。

下面是一个完整的示例,基于从地图中获取的令牌列表。(使用Apache Commons Lang中的StringUtils)。

Map<String,String> tokens = new HashMap<String,String>();
tokens.put("cat", "Garfield");
tokens.put("beverage", "coffee");

String template = "%cat% really needs some %beverage%.";

// Create pattern of the format "%(cat|beverage)%"
String patternString = "%(" + StringUtils.join(tokens.keySet(), "|") + ")%";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);

StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);

System.out.println(sb.toString());

编译完正则表达式后,扫描输入字符串通常非常快(尽管如果正则表达式很复杂或涉及回溯,那么您仍然需要进行基准测试以确认这一点!)

 类似资料:
  • 问题内容: 我需要以最有效的方式替换字符串中的许多不同子字符串。除了使用string.replace替换每个字段的强力方法以外,还有其他方法吗? 问题答案: 如果你要处理的字符串很长,或者你要处理许多字符串,那么使用java.util.regex.Matcher可能是值得的(这需要花很长时间进行编译,因此效率不高) (如果你的输入很小或搜索模式经常更改)。 以下是一个完整的示例,基于从地图中获取的

  • 问题内容: 说我有一个文件,其中包含一些文本。其中包含子字符串,例如“ substr1”,“ substr2”,“ substr3”等。我需要将所有这些子字符串替换为其他文本,例如“ repl1”,“ repl2”,“ repl3”。在Python中,我将创建一个这样的字典: 并创建用’|’组合键的模式,然后替换为function。在Java中有类似的简单方法吗? 问题答案: 这是您的Python

  • 问题内容: 在JavaScript中有一个简单的等效项吗? 这是使用PHP的,它允许您使用单词数组来查找和替换。我可以使用JavaScript / jQuery做类似的事情吗? 问题答案: 您可以使用自己的函数来扩展String对象,该函数可以满足您的需要(如果缺少功能,则很有用): 对于全局替换,您可以使用正则表达式: 要使用该功能,它将类似于您的PHP示例:

  • 问题内容: 我想使用函数替换多个字符串。 我目前有 但想有类似的东西 虽然那听起来不像是好的语法 正确的方法是什么?有点像如何在中进行操作\1以及\2如何将字段替换为某些搜索字符串 问题答案: 这是一个简短的示例,应该使用正则表达式来解决问题: 例如: ’() and –text–‘

  • 问题内容: 假设我有以下代码: 这段代码运行后,价值会 如果我以相反的顺序替换它们,则会发生类似的问题: 的值将是 我的目标是把成我怎么能做到呢? 问题答案: 使用Apache Commons StringUtils中的方法:

  • 每当“q”被写为我附加TextWatcher的edittext的最后一个字符时,这个“q”就会被替换为“a”。我使用: 但是,当我测试代码时,当我输入“q”时,什么也没发生。一些帮助?非常感谢。