如何匹配这种模式? (爪哇/正则表达式)

时间:2013-02-20 16:40:14

标签: 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 个答案:

答案 0 :(得分:2)

尝试重置循环中的tokenMatcher

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

System.out.println(value);

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

while(matcher.find()){
    matcher.appendReplacement(stringBuffer, "%" + String.valueOf(index++) + "\\$s");
}
matcher.appendTail(stringBuffer);

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

答案 3 :(得分: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();