IMPORTANT: Comme l'a souligné par Kip dans les commentaires, cette classe a une boucle infinie bug si la mise en correspondance des matchs sur la chaîne de remplacement. Je vais le laisser comme un exercice pour les lecteurs de le corriger, si nécessaire.
Je ne sais pas de quoi que ce soit de semblable qui est intégré dans Java. Vous pourriez rouler sans trop de difficulté, en utilisant le Comparateur de classe:
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);
}
}
}
Ensuite, composez le:
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);
Notez que vous pouvez obtenir l'ensemble de la chaîne trouvée en appelant matchResults.group()
ou matchResults.group(0)
, de sorte qu'il n'est pas nécessaire de passer le rappel de l'actuelle chaîne de l'état.
EDIT:en Fait, il ressemble plus à exactement la fonctionnalité de la fonction PHP.
Voici l'original, car le demandeur a aimé:
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());
}
}
}
Pour ce cas d'utilisation particulier, il peut être préférable de simplement la file d'attente de chaque match dans le rappel, puis par la suite exécuter par eux en arrière. Cela permettra d'éviter d'avoir à reconfigurer les indices que la chaîne est modifiée.