如何匹配这种模式?(Java/regex)

如何匹配这种模式?(Java/regex),java,regex,Java,Regex,我需要转换字符串: "%s blabla %s" 进入: 我的代码如下: Pattern pattern = Pattern.compile("%s"); Matcher tokenMatcher = pattern.matcher(value); int index = 1; while(tokenMatcher.find()){ String replacement = "%"+String.valueOf(index++)+"\\$s"; value =

我需要转换字符串:

"%s blabla %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匹配

有什么想法吗?

尝试重置循环中的令牌匹配器

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

System.out.println(value);
尝试在循环中重置令牌匹配器

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

System.out.println(value);

您必须使用新值重置匹配器:

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

原因是replaceFirst将匹配器重置为开头,但不会更改当前匹配的字符串,它仍然包含旧字符串。您必须自己更新匹配器。

您必须用新值重置匹配器:

while (tokenMatcher.find()) {
  String replacement = "%" + String.valueOf(index++) + "\\$s";
  value = tokenMatcher.replaceFirst(replacement);
  tokenMatcher.reset(value); // reset
  System.out.println(value);
}
原因是replaceFirst将匹配器重置为开头,但不会更改当前匹配的字符串,它仍然包含旧字符串。您必须自己更新匹配器。

请尝试下面的代码

 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();
试试下面的代码

 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();

最好添加一行StringBuffer初始化,因为OP的初始代码中没有该行;但这也是一个很好的解决方案+1最好添加一行StringBuffer初始化,因为OP的初始代码中没有它;但这也是一个很好的解决方案+1