有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要转换字符串:

"%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) 个答案

  1. # 1 楼答案

    尝试重置循环中的tokenMatcher

    while(tokenMatcher.find()){
        String replacement = "%"+String.valueOf(index++)+"\\$s";        
        value = tokenMatcher.replaceFirst(replacement);
        tokenMatcher = pattern.matcher(value);
    }
    
    System.out.println(value);
    
  2. # 3 楼答案

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

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

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

  3. # 4 楼答案

    试试下面的代码

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