2013-02-20 61 views
1

我需要改造的字符串:如何匹配这种模式? (Java /正则表达式)

"%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... 

任何想法是否匹配?

回答

2

你有你的匹配与新值复位:

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

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

2

尝试重置循环中的tokenMatcher

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

System.out.println(value); 
+0

我改变了代码。现在就试试。 – 2013-02-20 16:51:13

+0

现在它工作正常(+1) – Tom 2013-02-20 16:51:48

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(); 
1
while(matcher.find()){ 
    matcher.appendReplacement(stringBuffer, "%" + String.valueOf(index++) + "\\$s"); 
} 
matcher.appendTail(stringBuffer); 

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

+0

这将是一件好事,因为OP在他的初始代码中没有它,所以添加一个用'StringBuffer'初始化的行;但它也是很好的解决方案(+1) – Tom 2013-02-20 16:55:56