Bonjour à tous, je me casse les dents sur une expression régulière dans laquelle je souhaite inclure une exclusion sur une back reference.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
final String regex = "<([^>]+)>([^<]+)<\\s*(!(/\\1)|!(\\1))\\s*>";	// <(1)>(2)<(3(4)(5))>
Pattern pattern = Pattern.compile(regex);
Matcher matcher;
String replace = "<$1><span>$2</span><$3>";
 
	matcher = pattern.matcher("<p>toto</p>");	// pas de remplacement
	assert !matcher.find();
	matcher = pattern.matcher("<p>toto<br/></p>");	// <p><span>toto</span><br/></p>
	assert matcher.find();
	matcher = pattern.matcher("<p>toto<br></p>");	// <p><span>toto</span><br></p>
	assert matcher.find();
	matcher = pattern.matcher("<p>toto <span>titi</span></p>");	// <p><span>toto </span><span>titi</span></p>
	assert matcher.find();
Manifestement, ma RegEx ne fonctionne pas (j'utilise '!' avec de sérieux doutes, en fait mais '^' ne donne rien non plus) ; j'ai ajouté en commentaire le résultat attendu d'un #replaceAll éventuel, pour bien expliquer ce que j'essaye d'obtenir.

QUESTIONS :
Ai-je raison d'utiliser des back references avec java.util ?
Mon décompte des groupes est-il valable ?
Peut-on indiquer que l'on cherche "une section" qui n'est ni un premier groupe rencontré, ni ce même groupe avec un '/' devant ?

Merci d'avance pour toutes vos remarques, critiques et suggestions.