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

Я изменил код. Попробуй это сейчас. –

+0

Теперь он отлично работает (+1) – Tom

0

Try ниже код

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

Было бы хорошо добавить строку с инициализацией 'StringBuffer', поскольку OP не имел ее в своем исходном коде; но это тоже хорошее решение (+1) – Tom

Смежные вопросы