1

文字列を変換する必要があります:

"%s blabla %s"

の中へ:

"%1$s blabla %2$s"

私のコードは次のとおりです。

Pattern pattern = Pattern.compile("%s");
Matcher tokenMatcher = pattern.matcher(value);
int index = 1;
while(tokenMatcher.find()){
    String replacement = "%"+String.valueOf(index++)+"\\$s";        
    value = tokenMatcher.replaceFirst(replacement);
    System.out.println(value);
}

問題は、プログラムが無限ループに入ってしまうことで、その理由がわかりません。どういうわけか%1$s一致します%s

%1$s blabla %s
%2$s blabla %s
%3$s blabla %s
%4$s blabla %s
%5$s blabla %s
%6$s blabla %s
%7$s blabla %s
%8$s blabla %s
%9$s blabla %s
%10$s blabla %s
etc...

何か案が?

4

4 に答える 4

2

tokenMatcherループ内をリセットしてみてください。

while(tokenMatcher.find()){
    String replacement = "%"+String.valueOf(index++)+"\\$s";        
    value = tokenMatcher.replaceFirst(replacement);
    tokenMatcher = pattern.matcher(value);
}

System.out.println(value);
于 2013-02-20T16:48:06.980 に答える
2

マッチャーを新しい値でリセットする必要があります。

while (tokenMatcher.find()) {
  String replacement = "%" + String.valueOf(index++) + "\\$s";
  value = tokenMatcher.replaceFirst(replacement);
  tokenMatcher.reset(value); // reset
  System.out.println(value);
}

その理由は、replaceFirst() がマッチャーを先頭にリセットしますが、現在一致している文字列を変更せず、古い文字列がまだ含まれているためです。マッチャーを更新するには、自分で行う必要があります。

于 2013-02-20T16:49:27.540 に答える
1
while(matcher.find()){
    matcher.appendReplacement(stringBuffer, "%" + String.valueOf(index++) + "\\$s");
}
matcher.appendTail(stringBuffer);

http://tutorials.jenkov.com/java-regex/matcher.html#8

于 2013-02-20T16:50:59.573 に答える
0

以下のコードを試してください

 StringBuilder stringBuilder = new StringBuilder();
        int i = 1;

        for (String s : input.split("%s")) {
            stringBuilder.append(String.format("%s %d", s, "%"+i+++"$"));


       }

String newString = stringBuilder.toString();
于 2013-02-20T16:49:39.100 に答える