Java 替换除第一个字符串外的多个字符串

Java 替换除第一个字符串外的多个字符串,java,regex,Java,Regex,我有一个字符串,其中我希望删除除第一个以外的所有出现的§a,而§b和§c也是如此。例如: §ah§ae§al§bo§bw§bo§br§bl§bd应成为§ahell§bo world 在我的情况下,这些字符串之间总是有一个或两个字符,从而产生以下正则表达式: ((?使用String.indexOf(§a)然后只使用String.replace(§a),“”)处理该字符后面的所有内容将非常简单 可能会占用更多的内存,但我想你并不真的需要一个内存高效的解决方案 在任何情况下,这都会起作用,所以如果其他

我有一个字符串,其中我希望删除除第一个以外的所有出现的
§a
,而
§b
§c
也是如此。例如:

§ah§ae§al§bo§bw§bo§br§bl§bd
应成为
§ahell§bo world

在我的情况下,这些字符串之间总是有一个或两个字符,从而产生以下正则表达式:


((?使用String.indexOf(§a)然后只使用String.replace(§a),“”)处理该字符后面的所有内容将非常简单

可能会占用更多的内存,但我想你并不真的需要一个内存高效的解决方案

在任何情况下,这都会起作用,所以如果其他方法都不起作用,那么就这样做(即使使用3个字符串进行操作会使它更混乱)


要获得没有第一次出现的字符串,只需使用String.substring()和indexOf()

如果它不必是纯regex
replaceAll(regex,replacement)
解决方案,您可以使用
appendReplacement
循环和跟踪每个匹配子字符串的第一个实例的

Java 1.4+解决方案:

String input = "§ah§ae§al§al§bo §bw§bo§br§cl§cd";

Set<String> first = new HashSet<>();
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("§[abc]").matcher(input);
while (m.find())
    if (! first.add(m.group()))
        m.appendReplacement(buf, "");
String result = m.appendTail(buf).toString();

System.out.println(result);
Set<String> first = new HashSet<>();
String result = Pattern.compile("§[abc]").matcher(input)
        .replaceAll(mr -> first.add(mr.group()) ? "$0" : "");

好的,我想使用正则表达式而不是Java函数/循环。好吧,这里不是专家,但如果没有其他方法可行,你可能会退回到这一步。如果你能承受字符串开头和替换匹配之间的长度限制,你可以使用受限宽度查找,
text.replaceAll(“(?lookbehind有一个固定的长度。不是在Java中,请参见