2010-07-29 8 views
2

J'essaye en Java d'entourer un mot en HTML avec du balisage. Ce code lève une ArrayIndexOutOfBoundsException lorsque le replaceAll est appelé.Java RegEx replaceAll jette ArrayIndexOutOfBoundsException

Pattern pattern = Pattern.compile(wordToHighlight + "\\w{0,5}"); 
String replacement = "<span class='highlight'>$1</span>"; 
Matcher matcher = pattern.matcher(html); 

if (matcher != null) 
    if (matcher.find()) 
     retVal = matcher.replaceAll(replacement); 
+1

Que signifie 'html' contiennent à ce moment-là? –

+0

Qui s'en soucie? C'est une tentative simpliste pour mettre en évidence le texte de recherche dans une chaîne HTML arbitraire. Il y a d'innombrables façons dont cela peut mal tourner, mais cela fonctionnera dans la plupart des cas. Les utilisateurs peuvent s'amuser avec des effets intéressants s'ils incluent des chevrons dans leurs expressions de recherche. –

+1

Utilisez $ 0 plutôt que $ 1. – salathe

Répondre

2

Vous devriez essayer de placer un groupe de capture sur votre expression de recherche. c'est-à-dire envelopper votre chaîne entre parenthèses.

à-dire

"(" + wordToHighlight + "\\w{0,5})" 
5

Je ne suis pas familier avec Regex en Java, donc je vais juste aller de l'avant et faire une proposition, excusez-moi si je suis tout à fait farfelu. Dans PCRE (PHP) $ 1 se réfère au premier groupe de capture, puisque vous n'avez pas de groupe de capture qui pourrait lancer une erreur. Essayez d'utiliser 0 $.

0

Essayer quatre barres obliques inverses:

Pattern.compile (wordToHighlight + "\\ w {0,5}");

D'une certaine façon, l'échappement a lieu deux fois. Cela signifie:

1.) \\ se transforme en \

2.) puis \ se transforme en \

+0

Maintenant, le fichu éditeur a échappé à ma réponse. –

+0

Deuxième tentative: 1.) \\\\\\\ se transforme en \\\\ puis 2.) \\\\ se transforme en \\ –

+0

Maintenant, l'éditeur n'a pas échappé à ma réponse. –