2010-04-08 3 views
3

Je veux remplacer le premier contexte deJava String.replaceAll regex

web/style/clients.html

avec la méthode java String.replaceFirst je peux obtenir:

$ {} pageContext.request.contextPath /style/clients.html

J'ai essayé

String test = "web/style/clients.html".replaceFirst("^.*?/", "hello/"); 

Et cela me donne:

bonjour/style/clients.html

mais quand je fais

String test = "web/style/clients.html".replaceFirst("^.*?/", "${pageContext.request.contextPath}/"); 

me donne

java.lang.IllegalArgumentException: Référence de groupe illégale

Répondre

7

Mon intuition est qu'il explose car $ est un caractère spécial. De the documentation

Notez que antislashs() et le dollar signes ($) dans la chaîne de remplacement peuvent faire que les résultats soient différents que si elle était traitée comme une chaîne de remplacement littérale . Les symboles dollar peuvent être traités comme des références à sous-séquences capturées comme décrit ci-dessus, et les antislash sont utilisés pour caractères littéraux d'échappement dans la chaîne de remplacement .

Je crois que vous auriez besoin quelque chose comme

"\\${pageContext.request.contextPath}/" 
1

String test = "web/style/clients.html".replaceFirst("^.*?/", "\\${pageContext.request.contextPath}/");

devrait faire l'affaire. $ est utilisé pour la référence dans les regex

0

$ est un caractère spécial, vous devez y échapper.

String test = "web/style/clients.html".replaceFirst("^.*?/", "\\${pageContext.request.contextPath}/"); 
6

Il existe une méthode déjà disponible pour tous les caractères spéciaux dans un remplacement Matcher.quoteReplacement():

String test = "web/style/clients.html".replaceFirst("^.*?/", Matcher.quoteReplacement("${pageContext.request.contextPath}/"));