2013-02-20 62 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