ВАЖНО : Как указано Kip в комментариях, этот класс содержит ошибку бесконечного цикла, если совпадающее регулярное выражение совпадает в строке замены. Я оставлю это в качестве упражнения для читателей, чтобы исправить это, если это необходимо.
Я не знаю ничего подобного, встроенного в Java. Вы можете бросить свои без особых проблем, используя класс Matcher:
import java.util.regex.*;
public class CallbackMatcher
{
public static interface Callback
{
public String foundMatch(MatchResult matchResult);
}
private final Pattern pattern;
public CallbackMatcher(String regex)
{
this.pattern = Pattern.compile(regex);
}
public String replaceMatches(String string, Callback callback)
{
final Matcher matcher = this.pattern.matcher(string);
while(matcher.find())
{
final MatchResult matchResult = matcher.toMatchResult();
final String replacement = callback.foundMatch(matchResult);
string = string.substring(0, matchResult.start()) +
replacement + string.substring(matchResult.end());
matcher.reset(string);
}
}
}
Затем позвоните:
final CallbackMatcher.Callback callback = new CallbackMatcher.Callback() {
public String foundMatch(MatchResult matchResult)
{
return "<img src=\"thumbs/" + matchResults.group(1) + "\"/>";
}
};
final CallbackMatcher callbackMatcher = new CallbackMatcher("/\[thumb(\d+)\]/");
callbackMatcher.replaceMatches(articleText, callback);
Обратите внимание, что вы можете получить всю совпавшую строку, вызвав matchResults.group()
или matchResults.group(0)
, поэтому нет необходимости передавать обратный вызов текущему состоянию строки.
РЕДАКТИРОВАТЬ: Сделано это больше похоже на точную функциональность функции PHP.
Вот оригинал, так как аскеру понравилось:
public class CallbackMatcher
{
public static interface Callback
{
public void foundMatch(MatchResult matchResult);
}
private final Pattern pattern;
public CallbackMatcher(String regex)
{
this.pattern = Pattern.compile(regex);
}
public String findMatches(String string, Callback callback)
{
final Matcher matcher = this.pattern.matcher(string);
while(matcher.find())
{
callback.foundMatch(matcher.toMatchResult());
}
}
}
Для этого конкретного случая использования может быть лучше просто поставить в очередь каждое совпадение в обратном вызове, а затем выполнить их в обратном порядке. Это предотвратит необходимость переназначения индексов при изменении строки.