最善の方法では無いような気もしますが、思い付いた方法をば。
Java
1import java.util.function.Function;
2import java.util.regex.MatchResult;
3import java.util.regex.Pattern;
4
5
6class CountReplacer implements Function<MatchResult, String> {
7 private int cnt = 1;
8
9 @Override
10 public String apply(MatchResult m) {
11 return String.format(
12 "%s#%d", m.group(), cnt++
13 );
14 }
15}
16
17class Main {
18 public static void main(String[] args) {
19 var text = "apple banana belly banana apple belly";
20
21 {
22 var dst = Pattern.compile("apple")
23 .matcher(text)
24 .replaceAll(new CountReplacer())
25 ;
26 System.out.println(dst);
27 }
28 {
29 var dst = Pattern.compile("banana")
30 .matcher(text)
31 .replaceAll(new CountReplacer())
32 ;
33 System.out.println(dst);
34 }
35 {
36 var dst = Pattern.compile("belly")
37 .matcher(text)
38 .replaceAll(new CountReplacer())
39 ;
40 System.out.println(dst);
41 }
42 }
43}
実行結果 Wandbox
plain
1apple#1 banana belly banana apple#2 belly
2apple banana#1 belly banana#2 apple belly
3apple banana belly#1 banana apple belly#2
ラムダ式内から外部変数への再代入が効かないので、苦肉の策でクラスを組んでいます。
別解その1
関数型インターフェースを使わないで頑張ってみた方法。Wandbox
Java
1import java.util.regex.Pattern;
2
3
4class Main {
5 public static void main(String[] args) {
6 var text = "apple banana belly banana apple belly";
7
8 String dst;
9 {
10 var dstBuilder = new StringBuilder();
11 var matcher = Pattern.compile("apple").matcher(text);
12
13 var offset = 0;
14 for(var cnt = 0; matcher.find(offset); ++cnt) {
15 var start = matcher.start();
16 var end = matcher.end();
17
18 dstBuilder.append(
19 text.substring(offset, start)
20 );
21 dstBuilder.append(
22 String.format("%s#%d", matcher.group(), cnt+1)
23 );
24 offset = end;
25 }
26 dstBuilder.append(
27 text.substring(offset, text.length())
28 );
29
30 dst = dstBuilder.toString();
31 }
32
33 System.out.println(dst);
34 }
35}
別解その2
正規表現を使わずに頑張ってみた方法。Wandbox
各単語がスペース区切りならこれで充分です。
Java
1import java.util.StringJoiner;
2
3
4class Main {
5 public static void main(String[] args) {
6 var text = "apple banana belly banana apple belly";
7
8 String dst;
9 {
10 var joiner = new StringJoiner(" ");
11
12 var cnt = 0;
13 for(var word: text.split(" ")) {
14 if(word.equals("apple")) {
15 word = String.format("%s#%d", word, ++cnt);
16 }
17
18 joiner.add(word);
19 }
20
21 dst = joiner.toString();
22 }
23
24 System.out.println(dst);
25 }
26}