Bonjour,

j'ai une expression régulière qui lève une exception lorsque le texte source dépasse un certain nombre de caractère.
Il s'agit d'une StackOverflowError, sans numéro de ligne et sans explication claire.
Je ne comprend pas pourquoi cette erreur apparaît, peut-être avez vous une idée...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
		Pattern pattern = Pattern.compile("<BLOC>(\\s|.)*</BLOC>");
 
		StringBuffer txt = new StringBuffer();
		txt.append("<BLOC>");
		// exception avec i > 800
		for (int i=0; i<801; i++)
			txt.append("a");
		txt.append("</BLOC>");
 
		Matcher m = pattern.matcher(txt);
		if (m.find(0)) { // Exception in thread "main" java.lang.StackOverflowError
			System.out.println("find");
		}
pour l'exemple je remplis txt avec
<BLOC>aaaaaaaa...</BLOC>
L'exception est la suivante :
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$Dot.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
...ça recommence sur plusieurs dizaines de lignes
ça fonctionne avec 800 caratères mais pas plus.

Au passage cette expression n'est pas de moi et je connais pas la raison du (\\s|.)* dans le pattern plutôt que .*
Avec .* ça fonctionne sans problème, mais je voudrais tout de même bien comprendre cette l'origine de cette exception.